[Python] Built-in 객체 사용하기, 응용하기 (Python RCE)

두비니

·

2021. 5. 14. 01:42

 

 

 


Built-in 객체 사용하기, 응용하기 (for CTF)

Python built-in functions (Python RCE)


 

 

 

요즘 python으로 포너블 문제가 많이 나오던데, 왠만하면 이거 관련 문제들이여서 한번 정리하려고 합니당

 

 

1. __builtin__ 객체 소개

 

일단 'built-in'함수라는건 누구나 알고 있다고 생각합니다. 그 python에서 기본적으로 제공하는 그 함수들 맞아유! 더 중요하게 봐야할 건 built-in 객체입니다. 

예를 들어, builtins.open 은 내장 함수 open() 의 완전한 이름입니다. 이렇게 모든 내장 식별자를 연결하는 액세스를 제공합니다. 어려워 보일 수 있는데 사실 우리가 평소에 사용하던 것들입니다.

 

혹시나 더 궁금하신 분들은 여기

 

#1. Using builtins object
__builtins__.__dict__['__import__']("os").system("ls")

#2. NOT Using builtins object
import os

system("ls")

 

1번과 2번의 코드는 둘 다 같은 일을 합니다. 

2번같이 작성하려면 스크립트를 작성해야하는데, 1번같이 작성할 경우에는 한줄로 다 해결할 수 있다는 장점이 있죠.

그래서 pyjail같은 유형의 문제들은 보통 이 개념에 기반해서 풀이를 하고 있습니다.

이제 이걸 가지고 할 수 있는 것들을 알아봅시다.

 

2. 응용해보기

 

사실 ctf문제에서 이런 친구들을 만날 일은 builtins 객체가지고 장난치기 위해서 만든게 대부분입니다. 가장 기본적인 것들과 제가 개인적으로 유용하다고 생각했던 것들을 모아봤습니다.

 

일단 왜 굳이 길게길게 써서 실행을 시켜야 하느냐?라는 걸 물어 봤을 때, 다음과 같은 코드를 일단 봅시다.

 

import os

def main():
    text = input('Input text: ')
    if 'os' in text:
        print("Filtered Keyword.")
        return;
    else:
        exec(text)
        
if __name__ == "__main__":
    main()

 

우리가 결국 실행시키고 싶은 건 exec(text)로 exec(os.system("/bin/sh")같은 걸 하고 싶을텐데, os키워드를 필터링하기 때문에 불가능합니다.

이때 1번에서 소개한 방법을 사용하면 쉽게 풀 수 있습니다.

 

__builtins__.__dict__['__import__']("os").system("ls")

 

어차피 os라는 키워드가 들어가 있는 거니깐 상관없는거 아니냐? 라고 물을 수 있지만, 그럼 그냥 이런식으로 해결하면 되죵

 

__builtins__.__dict__['__import__']("o"+"s").system("ls")

 

이런식으로 우회가 가능하기 때문에, 사실상 블랙리스트를 무력화시킵니다. 만일 system이 막혀있는 상태라고 가정해도, __dict__['sys'+'tem']이런식으로 해버리면 되서, import명령어 자체를 막아놓지 않는 이상 사용할 수 있습니다.

 

그래서 이 방법에서 시작해서 파생된 방법들이 엄청나게 많습니다. 명령어도 builtins말고도 glob, subprocess 등등 넘쳐납니다. 이건 나중에 아예 cheat sheet로 작성할 예정입니다.

 

3. 몇가지 추가 팁들

 

원래는 대놓고 exec함수를 실행시키는 경우에 한해서만 이게 가능한 줄 알았는데, 아니더라구요!

 

 

이렇게 아무것도 안하는 함수의 인자로 집어넣어도, 실행이 잘 되는 것을 볼 수 있습니다. 

 

 

심지어 함수 안에 인자를 없애도, 일단 출력은 시킨 뒤에 에러가 발생하는 것을 볼 수 있습니다. 최근에 다른 ctf문제를 풀면서 알게되었습니다. 다시 생각해보니까 당연한건데 신기하더라구요ㅎㅎ

 

4. 관련 문제

 

이와 관련한 문제들입니다. 이건 제 티스토리에만 있는 것들이고, 다른 문제들도 많으니 시간나면 해보면 좋을 것 같아요! python상에서 사용할 수 있는거라 웹분야에서도 종종 다른 취약점과 섞여서 풀리는것 같습니다.

기본적으로 exec함수를 그냥 실행시켜주는데 블랙리스트가 존재하는 jail형식 문제들부터 요즘은 눈치껏 잘 알잘딱깔센하는 문제도 많이 출제되는 듯 하네요. 실습겸 풀어봐도 좋을 것 같습니다.

 

개인적으로 기존 퍼너블에서 멋어날 수 있어서 재미있는 유형이라고 생각합니다ㅎㅎ 조만간 python jail유형 문제들도 한번 쫙 정리해서 올릴게용. 끝!

 

 

1. DawgCTF 2021 - No Step on Snek (75 Points)

https://dokhakdubini.tistory.com/469

 

2. HackCTF - 7. 탈옥

https://dokhakdubini.tistory.com/391