사용자 입력을 다른 프로그램에 전달

사용자 입력을 다른 프로그램에 전달

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개를 원합니다 .CMDcat

저는 사용자 입력을 한 줄씩 다른 프로세스로 파이프하는 방법을 찾고 있습니다. 가급적이면 짧은 한 줄을 사용하는 것이 좋습니다. 이와 같은 사용자 입력 파이프를 어떻게 얻을 수 있습니까?

답변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종료합니다 . 기본적으로 출력은 출력되지 않고 대기 중이므로 인코딩된 출력은 반환되지 않습니다. 를 사용하면 사용자 입력이 반영되고 파이프되지만 입력 후에만 출력됩니다.catbase64base64catEOFcatEOFcat << EOF | base64base64EOF

$ cat << EOF | base64
pipe heredoc> ls
pipe heredoc> test
pipe heredoc> EOF
bHMKdGVzdAo=

반면, nc사용자 입력을 지속적으로 받기 위해서는 입력을 로 구분하면 됩니다 \n. 따라서 파이프라인은 cat | nc. 이것이 침투 테스트 및 CTF에서 쉘 catnc일반적인 방법을 얻는 방법입니다.

바인딩 쉘

# 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

관련 정보