STDIN을 통해 셸에 입력된 스크립트의 내용을 봅니다.

STDIN을 통해 셸에 입력된 스크립트의 내용을 봅니다.

몇 가지 조사 중이에요. /bin/sh( dash이 경우) 쉘에 입력을 실행하는 프로세스가 있습니다 STDIN. 다른 프로세스가 이 프로세스를 시작(데몬화)하며 이 프로세스의 기능과 스크립트의 모양을 알고 싶습니다.

예를 들어, 다음을 셸에 제출하면

echo 'echo ONE; sleep 99; sleep 666; echo TWO' | /bin/sh

언제든지 프로세스 목록에서는 sleep 99전체 스크립트가 아닌 현재 실행 중인 명령(예: )만 볼 수 있습니다.

전체 스크립트의 내용을 어떻게 복원할 수 있나요?

PS 이 질문의 요점은 스크립트를 누가/무엇으로 시작했는지, 왜 스크립트가 필요한지 등을 알 수 있는 방법을 찾는 것이 아닙니다.

답변1

Linux에서는 다음 을 사용하여 stdin에서 읽는 프로세스를 bpftrace보고 할 수 있습니다.sh

#! /usr/bin/env bpftrace
tracepoint:syscalls:sys_enter_read /comm == "sh"/ {
  /*
   * Upon read(2) syscall entry, record whether the read() is on fd 0 (stdin)
   * and if yes, where the read goes on a per-task basis
   */
  @from_stdin[tid] = (args->fd == 0);
  if (@from_stdin[tid]) {
    @addr[tid] = args->buf;
  }
}
tracepoint:syscalls:sys_exit_read /
  comm == "sh" &&
  @from_stdin[tid] &&
  args->ret > 0
/ {
  printf(
    "sh process %d read %d bytes from stdin: \"%r\"\n",
                tid,
                        args->ret,
                                               buf(@addr[tid], args->ret)
  );
}

그러면 실행이 echo 'echo foo | cat' | sh스크립트 출력에 표시됩니다.bpftrace

$ sudo ./that-bpftrace-script
./that-script:13:16-18: WARNING: Addrspace mismatch
  comm == "sh" &&
               ~~
Attaching 2 probes...
sh process 83359 read 15 bytes from stdin: "echo foo | cat\x0a"

(뭔진 모르겠지만주소 공간 불일치경고는 무해해 보이지만 억제할 수 있습니다.프로브 2개 연결...그리고 -q --no-warning).

답변2

쉘을 탈취하려고 시도할 수도 있지만 이는 잠재적인 문제를 야기할 수 있으며 게다가 제가 이것을 전혀 제대로 테스트하지 않았을 수도 있습니다.

  1. 셸을 에서 로 이동합니다 /bin/sh./bin/sh.bin
  2. /bin/sh캡처를 위해 호출되는 스크립트 만들기표준 입력파일에 저장한 다음 호출하여 /bin/sh.bin실행하세요.
  3. 스크립트가 실행 가능하고 다음을 사용하는지 확인하세요./bin/sh.bin

스크립트는 다음과 같습니다

#!/bin/sh.bin

# If it looks interactive run the real shell directly
[ -t 0 ] && exec /bin/sh.bin "$@"

# Otherwise grab stdin and then execute it
tee /tmp/sh_stdin.$$ | /bin/sh.bin "$@"

일부 루트 창에 다른 쉘이 열려 있는지 확인하십시오. 예를 들어, sudo bash스크립트 해킹이 작동하는지 확인할 때까지 세션을 닫지 마세요.그리고변경사항을 되돌렸습니다.

관련 정보