* file |
Summary : bypass authentication on ELF binary by sql injection
Binary info.
[retro300@localhost ~]$ file retro300 retro300: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped [retro300@localhost ~]$ file auth.db auth.db: SQLite 3.x database |
int main() |
main 함수에서는 daemonize 시킨후 접속한 클라이언트에게 client_callback함수를 실행시켜준다.
client_callback은 "letmeinpls"라는 문자열을 전송받으면 Username과 Passcode를 입력받고 인증루틴을 거친후 로그인처리를 한다.
[pwn3r@localhost ~]$ nc 127.0.0.1 5500
Username:pwn3r |
로그인에 성공하면 5가지의 메뉴를 띄워준후 선택을 기다린다.
............. ............. if ( check_serial(userindex, &client_serial) >= 0 ) { do { menu(fd); len = sock_read(fd, (int)str, 0x63u, 10); str[len] = 0; if ( len == 1 ) { choice = atoi(str); if ( (unsigned int)choice <= 9 ) JUMPOUT(__CS__, (unsigned int)menu_table[choice]); sock_send(fd, "please select from the options presented", 0); } else { sock_send(fd, "please select from the options presented", 0); } } while ( choice != 5 ); ............. ............. |
출력되는 메뉴에는 없지만 , 8번을 선택하면 /home/retro300/key 파일을 읽어 전송해주는 루틴을 실행한다.
그러므로 로그인에 성공하고 8번을 선택하기만하면 flag를 얻을 수 있다.
int __cdecl sub_80496F7(int client_fd) |
인증처리과정은 단순하다.
Username을 입력받고 auth.db에 query(select id,pin from users where user='%s')를 보내 Username에 해당하는 Pin과 id를 가져온다.
그리고 auth.db에서 가져온 id와 현재 시간을 이용한 연산을 통해 10글자의 시리얼을 생성한다.
최종적으로 Client에게 입력받은 Passcode와 [db에서 가져온 Pin]+[10글자의 시리얼] 을 비교함으로써 로그인처리를 한다.
auth.db
query > select * from users; --------------------- |
아래는 시리얼을 생성하는 핵심 루틴이다.
int check_serial(int index, const char *serial) res = -1; |
내부적으로 여러가지 연산을 하는 함수를 호출해 시리얼을 생성한다.
3가지 방법으로 풀이가 가능하다.
1) 시리얼을 생성하는 루틴을 분석한후 , 시리얼을 생성해 전송하는 script를 작성하는 방법. |
2) ptrace를 이용해 디버깅을 방지하는 부분을 우회 , 디버거에서 생성된 시리얼을 확인하여 대회서버에 전송해 인증하는 방법. |
3) sql injection으로 id 값을 조작해 시리얼을 조작한다. |
3번방법을 이용해 풀이한다.
sprintf(realserial, "%0.10u", tmp * (index + 1)); |
시리얼생성함수에서 위처럼 (id + 1) 과 연산된 값(tmp)을 곱하여 시리얼을 생성하는데 , sql injection으로 id 값을 -1로 조작해준다면 시리얼은 항상 '0000000000'이 되어버린다.
이를 이용해 로그인에 성공하고 flag를 얻을 수 있다.
[pwn3r@localhost rr300]$ nc 192.168.123.131 5500
Username:pwn3r' union select -1,'1234'-- 8 |
Flag : lookheedsurLovesemsumAPT
'CTF' 카테고리의 다른 글
CSAW CTF Quals 2011 - bin1 (0) | 2011.09.27 |
---|---|
Defcon 19th CTF Quals - Retro Revisted 200 (0) | 2011.09.25 |
ISEC 2011 본선 CTF - board (0) | 2011.09.21 |
ISEC 2010 본선 CTF - hks (0) | 2011.09.17 |
Defcon 19th CTF 2011 Quals - Potent Pwnables 100 (0) | 2011.09.11 |