cat
매개변수 없이 실행하면 사용자 입력이 반영된다는 것을 알고 있습니다.
$ cat
test
test
reflected
reflected
리플렉션의 출력을 다른 프로그램으로 파이프하고 싶습니다 base64
. 예를 들어 예상되는 동작은 다음과 같습니다.
$ cat | base64
test
dGVzdA==
another
YW5vdGhlcg==
입력되는 대로 텍스트를 한 줄씩 인코딩하고 싶거나 그런 것을 전달하고 싶습니다 nc
. 그러나 이렇게 사용하면 출력이 반영되지 않는 것 같고 이스케이프는 ctrl+C
출력 없이 전체를 종료합니다.
$ cat | base64
test
fail
^C
모든 것이 제대로 작동한다면 다음과 같이 인코딩/암호화된 연결을 설정할 수 있어야 합니다(매우 간단한 채팅 애플리케이션).
# client
$ $CMD | encrypt | nc $SERVER $PORT
this is a test
multiple lines
^C
# host
$ nc -lvp | decrypt
this is a test
multiple lines
마찬가지로 다음과 같이 인코딩하고 저장할 수 있어야 합니다.
$ CMD | base64 | tee log_file
test
dGVzdA==
another
YW5vdGhlcg==
^C
$ cat log_file
dGVzdA==
YW5vdGhlcg==
모든 것이 파이프여야 한다는 점에 유의하세요. 루프를 사용하면 nc
각 반복이 새로운 연결을 설정하므로 제대로 작동하지 않습니다. tee
그렇지 않으면 -a
파일의 모든 줄(각 반복)을 덮어쓰게 됩니다. nc
와 같은 것에서 입력 파이프를 가져오지만 base64
파일 대신 사용자 입력을 사용 하는 최종 명령(예: , )의 인스턴스 1개를 원합니다 .CMD
cat
저는 사용자 입력을 한 줄씩 다른 프로세스로 파이프하는 방법을 찾고 있습니다. 가급적이면 짧은 한 줄을 사용하는 것이 좋습니다. 이와 같은 사용자 입력 파이프를 어떻게 얻을 수 있습니까?
답변1
이 같은?
# this is an infinite loop, but can be changed to whatever you need
while true; do read x; echo "$x" | base64; done
산출:
foo
Zm9vCg==
bar
YmFyCg==
답변2
cat | base64
예상대로 작동하지 않는 이유를 알아냈습니다 . base64
받아들여야 한다모두(제 생각에는) 에 의해 입력, 종료되었습니다 EOF
. 의 출력에는 cat
종료자가 없으므로 base64
입력 수신 및 버퍼링을 중단하지 않고 합계를 ctrl-C
종료합니다 . 기본적으로 출력은 출력되지 않고 대기 중이므로 인코딩된 출력은 반환되지 않습니다. 를 사용하면 사용자 입력이 반영되고 파이프되지만 입력 후에만 출력됩니다.cat
base64
base64
cat
EOF
cat
EOF
cat << EOF | base64
base64
EOF
$ cat << EOF | base64
pipe heredoc> ls
pipe heredoc> test
pipe heredoc> EOF
bHMKdGVzdAo=
반면, nc
사용자 입력을 지속적으로 받기 위해서는 입력을 로 구분하면 됩니다 \n
. 따라서 파이프라인은 cat | nc
. 이것이 침투 테스트 및 CTF에서 쉘 cat
과 nc
일반적인 방법을 얻는 방법입니다.
바인딩 쉘
# user
$ cat | nc $IP 1337
# target
$ nc -lp 1337
안티 쉘
# user
$ cat | nc -lp 1337
# target
$ nc $IP 1337
애플리케이션( base64
및 ) nc
간 버퍼링 및 터미네이터의 차이 로 인해 약간의 조정 없이는 제가 만들고 싶은 파이프라인이 불가능합니다. 모든 출력을 한 번에 반환하는 명령(예: base64
)을 루프 안에 넣고 while
, 입력을 한 줄씩 가져오는 명령(예: 파이프 오른쪽)을 넣어 최종 체인을 nc
구현할 수 있습니다.
# code courtesy of @muru in the comments
while read x; do
echo "$x" | base64
done | nc