이 프로젝트는 자매 프로젝트 충돌과 마찬가지로 적대적인 검열 환경에서 완벽하게 작동하는 암호화된 셸과 TCP/UDP 전달을 설정할 수 있는 검열 방지 도구 세트에 속합니다. 다른 수단을 사용할 수 없는 경우 UART 또는 adb를 통해 장치에서 데이터를 덤프하는 법의학에도 유용합니다.
UART 연결을 통해 Pi로 전달되는 DNS 조회 및 SSH 세션
PSC는 신뢰할 수 있고 모딩/필터링 없이 Base64 인코딩된 데이터를 보내고 받을 수 있는 한 기본 전송에 구애받지 않고 단일 또는 다중 홉으로 셸 세션을 e2e 암호화할 수 있습니다. 수신한 e2e pty(예: 포트 셸 내부)와 함께 OpenSSH의 -L
매개변수와 유사하게 TCP 및 UDP 연결을 전달할 수 있습니다. 이는 시작점에서 로컬로 할당된 IP 주소가 필요 없이 투명하게 작동합니다. 이를 통해 법의학 전문가와 침투 테스터는 다음을 통해 네트워크 연결을 생성할 수 있습니다.
adb shell
세션(OEM adbd
TCP 전달을 지원하지 않는 경우)실제로 ppp를 지원하는 원격 피어 없이 쉘 세션 내에 보이지 않는 ppp 세션이 있다고 상상해 보십시오.
Linux, Android, OSX, Windows, FreeBSD, NetBSD 및 (아마도) OpenBSD 에서 실행됩니다.
PSC에는 원격으로 포트 셸이나 모뎀 전화 접속을 통해 실제 웹 브라우징 세션을 가질 수 있도록 SOCKS4 및 SOCKS5 프록시 지원도 포함되어 있습니다.
Makefile
상단에 정의된 대로 사전 공유 키를 반영하도록 Makefile
편집합니다.
그런 다음 Linux 및 OSX 에서는 make
입력하면 됩니다.
BSD 에서는 대신 GNU make를 설치하고 gmake
호출해야 합니다.
Windows 에서는 cygwin을 설치하고 적절한 gcc, gcc-g++, make
및 git
패키지를 선택해야 합니다.
Linux 에서 PSC는 Unix98 의사 터미널을 사용하고 다른 시스템에서는 POSIX pty를 사용하지만 이는 사용자에게 투명해야 합니다. 나는 특별한 이유로 석기 시대에 4.4BSD pty와 SunOS 지원을 추가한 적이 있으므로 Solaris 에서도 구축될 수도 있고 구축되지 않을 수도 있습니다.
자랑스럽게 후원하는 사람:
평범하고 단순합니다. 로컬 상자에서 pscl
실행하고 원격 사이트 에서 특정 주소로 전달하려는 TCP 또는 UDP 포트를 전달합니다. 예를 들어:
linux:~ > ./pscl -T 1234:[192.168.0.254]:22 -U 1234:[8.8.8.8]:53
PortShellCrypter [pscl] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: set up local TCP port 1234 to proxy to 192.168.0.254:22 @ remote.
pscl: set up local UDP port 1234 to proxy to 8.8.8.8:53 @ remote.
pscl: Waiting for [pscr] session to appear ...
linux:~ >
[ UART / SSH / ... login to remote side ... ]
쉘 세션이 있는 원격 사이트(마지막 홉)에서 포트 쉘, SSH, 콘솔 로그인 등에 관계없이 pscr
실행합니다.
linux:~ > ./pscr
PortShellCrypter [pscr] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: Seen STARTTLS sequence, enabling crypto.
linux:~ >
pscr
실행하면 양쪽 끝에서 암호화 핸드셰이크가 설정되고 기존 세션에 투명한 추가 프로토콜이 배치됩니다. 그런 다음 로컬 상자에서 127.0.0.1:1234
에 연결하여 TCP를 통해 192.168.0.254:22
에 연결하거나 UDP를 통해 8.8.8.8
확인자에 연결할 수 있습니다. 원격 사이트에 IPv6 연결이 있는 경우 이는 [IPv6] 주소에서도 작동합니다. 실제로 로컬 측에서는 항상 127.0.0.1
에 연결하므로 이를 사용하여 IPv4 소프트웨어를 IPv6로 변환할 수도 있습니다.
여러 -T
및 -U
매개변수를 전달할 수 있습니다. 세션이 이미 e2e 암호화되어 추적을 잃어버린 경우 로컬 pscl
프로세스에 SIGUSR1
을 보내면 알려줄 것입니다.
PSC는 양말5와 DNS 포트를 원격 호스트 127.0.0.1
주소로 전달할 수 있는 원격 SSH 셸에서 tor를 사용하려는 경우에도 유용합니다. SSH는 UDP 패킷을 전달하지 않으므로 일반적으로 두 개의 socat
커넥터 또는 이와 유사한 커넥터를 사용하여 tor 노드를 통해 확인합니다. PSC는 UDP 데이터그램 경계를 유지하는 장점이 있는 반면, SSH -L
통한 socat
데이터그램 경계를 깨고 잘못된 형식의 DNS 요청을 생성할 수 있습니다.
세션은 Makefile
에서 선택한 PSK의 aes_256_ctr
로 암호화됩니다. 이 암호화 체계는 가변적이지만 AAD 또는 OAD 데이터를 추가하면 패킷 크기가 커집니다. 즉, 대화형 세션에서 Base64 인코딩으로 인해 입력된 각 문자로 인해 모든 바이트가 계산되므로 이미 훨씬 더 많은 데이터가 전송됩니다.
UART 세션은 screen
통해 사용할 수 있지만 예를 들어 minicom
통해서는 사용할 수 없습니다. 왜냐하면 minicom은 상태 표시줄이 있는 보이지 않는 창을 생성하고 PSC 프로토콜을 파괴하는 필터처럼 작동하기 때문입니다. PSC는 필터링을 감지하려고 시도하며 일정량의 데이터 조작을 감당할 수 있지만 어떤 상황에서는 복구가 불가능합니다. tmux
와 비슷한 것입니다. 들어오는 데이터를 너무 많이 엉망으로 만들거나 처리하는 pty 핸들러를 PSC와 함께 쌓는 것을 피해야 합니다.
PSC가 pty에서 실행할 쉘을 파악하려면 pscl
및 pscr
모두에 대해 SHELL
환경 변수를 설정해야 합니다. SHELL
대부분의 환경에서 기본적으로 설정되어 있지만, 그렇지 않은 경우에는 SHELL=/bin/bash pscl
등과 같이 PSC를 실행해야 합니다.
pscl
SOCKS4 ( -4 port
) 및 SOCKS5 ( -5 port
)를 통한 TCP 연결 전달도 지원합니다. 이는 TCP 연결을 위한 SOCKS 포트로 포트를 설정하므로, 예를 들어 침투 테스트 중에 다른 연결을 열 필요 없이 포트 셸 세션에서 원격 네트워크를 탐색할 수 있습니다. -N
pscl
에 전달하면 원격 측에서 DNS 이름 확인이 활성화되므로 크롬도 함께 사용할 수 있습니다. 하지만 주의할 점: 시작 시 사용자가 제어할 수 없는 일련의 DNS 이름을 확인하려고 시도하는 브라우저에는 개인 정보 보호 문제가 있습니다. 또한 원격 측의 DNS 설정이 손상된 경우 DNS 응답 패킷이 누락되면 타이핑 셸이 몇 초 동안 차단될 수 있습니다. 내장 가능하고 이식 가능한 좋은 비동기 확인 기능이 없기 때문에 DNS 문제가 있는 경우 몇 초 동안 차단할 수 있는 대가를 치르고 단일 스레드의 getaddrinfo()
에 의존해야 했습니다. 이것이 바로 이름 확인을 명시적으로 활성화해야 하는 이유입니다. pscr
DNS 조회 캐시와 관련된 이러한 잠재적인 문제를 최소화하려고 시도하므로 대부분의 상황에서는 문제 없이 작동합니다. -X IP-address
(첫 번째 인수여야 함)를 전달하면 로컬 프록시를 127.0.0.1
과 다른 주소에 바인딩할 수 있으므로 로컬 네트워크에서 프록시를 공유할 수 있습니다.
psc 기능을 사용하면 원격 사이트에 pscr
바이너리를 설치할 수 없는 경우에도 여러 홉을 통해 원격 장치 간에 TCP 연결 또는 바이너리 데이터 blob을 전달할 수 있습니다. 이는 장치(예: UART 연결 전화일 수 있음)에서 아티팩트를 다운로드할 수 있는 수단이 없거나 시스템의 증거를 파괴하지 않기 위해 FS를 건드리지 않고 연결을 전달해야 하는 경우 법의학 목적으로 매우 유용합니다. 루트 FS는 ro 마운트되어 있으며 도구 세트를 업로드할 수 없습니다.
원격으로 아무것도 설치할 필요 없이 로컬 tty를 통해 원격 상자로 TCP 연결 홉을 볼 수 있기 때문에 이것은 정말 멋진 기능입니다.
이는 로컬 pty 펑크록에 의해서만 작동하며 pscl
에 바운스 명령을 전달하여 원격 셸( pscr
실행 없이)에 놓이게 하고 로컬 측에서 데이터를 필터링하고 처리하는 일부 상태 엔진 마법을 수행합니다. 일반적으로 실제 명령을 실행하기 전에 먼저 원격 pty를 원시 모드로 설정하고 -B
에 전달되는 기타 세부 정보를 설정해야 합니다. 논쟁은 다음과 같은 부분으로 나누어진다:
:
가 옵니다(예: 1234:
).stty -echo raw
또는 python -c "import tty;tty.setraw(0)"
( -B
도 인용해야 하므로 인용문을 올바르게 가져오도록 주의) 또는 비슷한 것.stty
와 cmd 시작 사이의 경합을 피하기 위해 데이터 전송을 시작하도록 pscl
에 지시하는 원격에서 발행된 "GO" 표시입니다. 예를 들어 echo GO
완벽합니다.nc 127.0.0.1 22
pscl
이 tty 상태를 재설정할 수 있습니다. echo FIN
해드리겠습니다. 권장됩니다. 그렇지 않으면 명령 끝을 인식하는 데 문제가 발생할 수 있습니다.;
로 구분됩니다. 그리고 괄호로 묶었습니다.예:
TCP 연결을 전달하려면 이 예에서는 장치에 stty
및 nc
설치되어 있어야 하지만 이론적으로는 이에 상응하는 다른 것이 있을 수도 있습니다.
로컬 세션을 시작합니다.
./pscl -B '1234:[stty -echo raw;echo GO;nc example.com 22;echo FIN]'
포트 1234에 로컬로 연결한 다음 표시되는 모든 데이터를 앞뒤로 전달하고 트래픽 속도를 제한하면 stty -echo raw;echo GO;nc example.com 22;echo FIN
명령이 원격 장치에 실행됩니다. 장치의 tty 속도(기본값은 115200)를 초과하지 않습니다.
pscl 세션이 시작되면 UART, ssh -e none ...
등을 통해 원격 장치에 연결하고 원격 셸이 있으면 로컬에서도 다음을 입력합니다.
ssh [email protected] -p 1234
SSH 연결을 로컬 상자에서 원격 장치를 거쳐 example.com
대상으로 반송합니다. 물론 pscr
변형이 선호됩니다. -B
한 번에 하나의 연결만 바운스할 수 있고(다양한 전달을 위해 여러 개의 -B
명령을 전달할 수 있지만) pty가 raw -echo
에 있으므로 TCP 세션 후에 쉘을 중단할 가능성이 있기 때문입니다. raw -echo
모드이며 최종 원격 피어도 연결을 닫는지 여부에 따라 그 후에 셸이 중단될 수 있습니다. 연결이 완료되었다는 pscl 알림을 발견하고 프롬프트가 표시되면 이를 reset
하여 새 연결을 시작할 수 있도록 해야 합니다. 데이터가 전달되는 동안 pscl
에 7비트 ASCII <
및 >
알림이 표시됩니다. 이는 보다 쉬운 디버깅 및 진행 감지를 위해 로컬에 불과합니다.
원격 사이트에 대한 연결은 8비트 깨끗해야 합니다. 즉, ssh, telnet, UART 또는 모든 채널은 이스케이프 시퀀스를 처리하면 안 됩니다 ( pscr
사용할 때와는 다름). SSH 연결의 경우 이는 pscl
세션에서 ssh -e none
사용해야 함을 의미합니다.
다음으로, 바이너리 파일 xfer를 처리하기 위한 몇 가지 예를 따르십시오. 여기서 rfile은 원격 파일을 나타내고 lfile은 로컬 파일을 나타냅니다.
원격 파일을 삭제하기 위해 세션을 시작하려면 로컬에서 다음을 수행하십시오.
./pscl -B '1234:[stty -echo raw;echo GO;dd of=rfile.bin bs=1 count=7350;echo FIN]'
원격 측에서 예상하는 데이터의 양을 지정해야 하는 경우. (예: cat>...
) 없이도 작동하지만 cat
끝없이 입력을 기대하므로 전송이 완료된 후 세션이 중단됩니다. dd count=...
사용하면 깔끔하게 종료되고 FIN 마커로 이에 대한 알림을 받게 됩니다.
그런 다음 방금 시작된 pscl
세션 내에서 원격 장치의 셸을 가져오는 데 필요한 ssh 등이 필요합니다. 두 번째 터미널에서 로컬로:
dd if=lfile.bin|nc 127.0.0.1 1234
이는 pscl
의 로컬 포트 1234에 연결하고 원격 측에서 dump 명령을 실행하여 로컬 lfile.bin
의 바이너리 데이터를 원격 rfile.bin
으로 전달합니다. 속도 제한으로 인해 시간이 걸릴 수 있으며 전송이 완료되었는지 여부만 psc 진행 화면을 신뢰합니다 . local dd ...|nc ...
명령은 파일이 pty를 통해 전송되는 동안 로컬 TCP 버퍼로 인해 전체 파일을 밀리초 단위로 먹을 수 있는 로컬 상태만 표시합니다. 따라서 pscl 화면에서 완료되었음을 알릴 때만 Ctrl-C
누르거나 dd ...|nc ...
세션에서 FIN
종료 마커가 다시 표시되는 것을 확인하십시오.
마찬가지로 유사한 명령을 사용하여 법의학 목적으로 원격 장치에서 로컬 상자로 바이너리 데이터를 전송할 수 있습니다. 다시 한 번 로컬에서 세션을 시작합니다.
./pscl -B '1234:[stty -echo raw;echo GO;dd if=rfile.bin]'
또는
./pscl -B '1234:[stty -echo raw;echo GO;cat rfile.bin]'
그런 다음 원격 장치로 SSH를 통해 셸을 가져온 다음 다시 로컬로 연결합니다.
nc 127.0.0.1 1234|dd of=lfile.bin bs=1 count=7350
로컬 파일 lfile.bin
에 복사된 크기 7350의 rfile.bin
얻으려면
장치에서 stty -echo raw
사용할 수 없는 경우 python -c "import tty;tty.setraw(0)"
와 같은 명령도 작동합니다. 원시 모드를 설정하는 stty
명령에는 실제 tty가 필요하기 때문에 원격 장치에서는 바운스 명령을 사용할 때 tty(포트 쉘뿐만 아니라)가 있어야 합니다.
psc가 직렬 연결을 통해 실행되는 경우 손실된 비트로 인해 모든 재미가 사라질 수 있습니다. HW FC 없이 실행하면 결국 비트 손실과 연결 중단이 발생하게 됩니다. 특히 바운스 명령을 사용할 때 장치가 사용자 방향으로 데이터를 전송할 때 제한이 없기 때문입니다. 이 데이터가 pscl
속도 제한을 통과하므로 장치에 데이터를 덤프하는 것이 더 잘 작동합니다.
그러나 장치 및 HW FC에서 pscr
사용할 수 없는 상황에서 나에게 도움이 된 몇 가지 팁은 다음과 같습니다. 이는 잠재적으로 신뢰할 수 없는 전송 채널이므로 UART를 사용할 때만 적용됩니다.
pscr
사용하면 사용자 방향으로 전송되는 데이터에 대한 속도 제한을 설정할 수 있습니다. 장치를 향한 방향은 항상 속도 제한이 있으므로 바운스 명령을 사용하여 크로스 컴파일된 pscr
바이너리를 장치에 덤프하고 양방향 속도 제한 세션을 시작할 수 있습니다.tio -o 1
또는 -o 2
사용하십시오.115200
으로 설정되어 있지만 38400
선호합니다).-DRESPECT_UART_BUFSIZE=4096
으로 psc
컴파일하지만 이렇게 하면 세션이 매우 느려집니다. contrib
폴더 내에는 이스케이프 문자 처리를 비활성화하는 tio-noprefix
패치도 있지만 이 패치는 업스트림이 이미 이 패치를 승인하고 통합했기 때문에 이전 버전에만 필요합니다. UART를 사용할 때는 tio
사용하는 것이 좋습니다.
tio 에서 바운스 명령을 사용하는 경우 ~/.tioconfig
파일에 다음을 추가해야 합니다.
[default]
prefix-ctrl-key = none
ESC 처리를 비활성화하고 8비트 클린 채널을 제공합니다.
SIGUSR1
pscl
로 보내면 세션이 암호화되었는지 여부를 알 수 있습니다. 원격 pscr
이 로컬 부분에 신호를 보낼 가능성 없이 종료되거나 종료되면 pscl
암호화 모드를 유지하므로 정지됩니다. 이 경우 SIGUSR2
전송하여 일반 텍스트 모드로 강제 재설정하여 새 세션을 시작할 수 있습니다.
버전 0.64부터 psc는 스크립팅 소켓을 지원하므로 파일을 가져오거나 넣거나 붙여넣기 버퍼를 원격 콘솔에 덤프하는 데 더 이상 screen
필요하지 않습니다. 대신 다음과 같이 로컬 세션을 시작합니다.
~ > ./pscl -S ~/psc.script_sock
그런 다음 이전과 같이 사용할 수 있습니다. 당신이 좋아하는 것을 '붙여넣어야' 한다면:
~ > ./pscsh -S ~/psc.script_sock -f script_/helloworld
그러면 script_/helloworld
의 내용이 콘솔에 '입력'됩니다. 스크립팅하는 동안 삽입된 입력이 입력과 섞이지 않도록 pscl
의 stdin이 차단됩니다. pscsh
에서 -S
생략하면 ~/psc.script_sock
이 자동으로 사용됩니다. 안전상의 이유로 스크립트는 script_
접두사로 시작해야 합니다.
보너스로 이제 pscr
편의를 위해 CR 내장 문자가 있는 경우에도 파일을 base64로 인코딩/디코딩하는 기능이 포함되어 있습니다. uuencode -m
과 호환됩니다.