![Unix/Linux에서 프로세스 숨기기](https://linux55.com/image/158658/Unix%2FLinux%EC%97%90%EC%84%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EC%88%A8%EA%B8%B0%EA%B8%B0.png)
내가 하나 찾았어흥미로운 기사ps
, top
, ... 와 같은 프로세스 모니터링 도구에서 lsof
Linux의 특정 프로세스를 숨기는 방법에 대해 설명합니다.
Person은 프로세스를 숨기는 방법에는 여러 가지가 있다고 지적합니다.
- 적절한 프레임워크 사용
SELinux
: 및Grsecurity
와 같이 정확히 이 작업을 수행하는 정말 좋은 프레임워크가 많이 있습니다 . 생산 시스템에서 나는 이것을 확실히 고려할 것입니다. 하지만 오늘은 손을 더럽히고 처음부터 무언가를 만드는 것을 즐기고 싶었습니다.top/ps/...
바이너리 파일 수정: 각 도구의 소스코드를 얻어서 직접 구현할 수 있습니다."리눅스 프로세스 숨기기" 바이너리를 논리, 재컴파일 및 교체합니다. 매우 비효율적이고 시간 소모적입니다.- 조정
libc
readdir()
: 내부의 기능을 수정 하고 특정 파일에 대한 접근을libc
차단하는 코드를 입력할 수 있습니다 ./proc
하지만 재컴파일이libc
부담스럽고,libc
코드가 이해하기 어려운 경우가 많습니다.- 커널에서 시스템 호출 수정: 이것은 가장 진보된 것이며
getdents()
사용자 정의 모듈을 사용하여 커널에서 직접 시스템 호출을 가로채고 수정하는 방식으로 작동합니다. 확실히 유혹적이지만, 저는 이미 Python에서 시스템 호출 차단이 작동하는 방식에 매우 익숙하기 때문에 오늘은 이 경로를 따르지 않을 것입니다.sysdig
그래서 새로운 것을 하고 싶었습니다.나는 재미있고 간단하며 한 시간 정도 안에 구현할 수 있는 중간 솔루션을 선택하기로 결정했습니다. "libc 수정"에서 제공하는 까다로운 기능을 기반으로리눅스 동적 링커(런타임에 프로그램에 필요한 다양한 라이브러리를 로드하는 역할을 담당하는 구성 요소),사전 로딩.
그리고사전 로딩Linux는 다른 일반 시스템 라이브러리를 로드하기 전에 사용자 정의 공유 라이브러리를 로드할 수 있는 옵션을 제공할 만큼 친절합니다. 즉, 사용자 정의 라이브러리가 시스템 라이브러리의 함수와 동일한 시그니처를 가진 함수를 내보내면 실제로 라이브러리의 사용자 정의 코드로 이를 재정의할 수 있으며 모든 프로세스가 자동으로 사용자 정의 함수를 선택합니다!
readdir()
libc를 재정의하는 매우 간단한 사용자 정의 라이브러리를 작성 하고 프로세스를 숨기는 논리를 작성할 수 있기 때문에 이것은 내 문제에 대한 해결책처럼 들립니다 ! 논리도 매우 간단합니다. 디렉토리를 볼 때마다/proc/PID
(여기서PID~이다프로세스 PID이름을 읽는 중"evil_script"
), 해당 액세스를 깔끔하게 차단하여 전체 디렉터리를 숨깁니다! 나는 이러한 아이디어를 계속해서 코드로 구현했습니다. 다음에서 소스를 얻을 수 있습니다. https://github.com/gianlucaborello/libprocesshider/blob/master/processhider.c (실제로 주석까지 포함하면 코드가 100줄도 안 되니 꼭 읽어보세요!) 코드가 작성된 후 이를 공유 라이브러리로 컴파일하고 시스템 경로에 설치합니다.
소스 코드:프로세스 hider.c
따라서 단계는 다음과 같습니다.
make
=>gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl
mv libprocesshider.so /usr/local/lib/
(처럼뿌리)echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
이제 내 질문/질문으로 돌아갑니다.: 여기서 설명하는 내용은 다음과 같습니다.리눅스 시스템. Ubuntu 18.04(64비트) 컴퓨터에서 테스트했는데 모든 것이 잘 작동했습니다. 이제 프로세스가 ps
.
먼저 코드의 다음 부분을 제거해야 했습니다.
DECLARE_READDIR(dirent64, readdir64);
오류가 발생하기 때문에( dirent64
에 정의되지 않음디렌테.h- 방금 locate dirent.h
코드를 사용하여 일부 인터넷 리소스와 비교했습니다.)
processhider.c: In function 'readdir64':
processhider.c:87:37: error: dereferencing pointer to incomplete type 'struct dirent64'
get_process_name(dir->d_name, process_name) && \
^
processhider.c:97:1: note: in expansion of macro 'DECLARE_READDIR'
DECLARE_READDIR(dirent64, readdir64);
^
*** Error code 1
삭제한 후 플래그 DECLARE_READDIR(dirent64, readdir64);
에 대해 불평하는 또 다른 오류가 발생합니다 .-ldl
/usr/local/bin/gcc5 -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl
/usr/local/bin/ld: cannot find -ldl
collect2: error: ld returned 1 exit status
*** Error code 1
Stop.
내가 하나 찾았어해결책내 파일의 위치로 대체 -ldl
될 수 있는 위치 (의미-L/usr/local/lib
libdl.so
Collect2: 오류: ld가 종료 상태 1개를 반환했습니다." 실수).
그런 다음 코드를 컴파일할 수 있습니다. 라이브러리 /usr/local/lib/
를 넣고 /etc/ld.so.preload
.
그러나 스크립트를 호출하면 evil_script.py
(코드는 다르지만(더 이상 UDP 패킷 스팸이 없음) while true
루프가 있으므로 time.sleep(60)
프로세스가 거기에 있어야 함) 프로세스 목록( ps auxww
)에 계속 나타납니다. 어쩌면 /etc/ld.so.preload
일하지 않습니까? ld.so
공유 라이브러리에 문제가 있을 수 있나요? 이 시점에서 발생하는 문제를 테스트할 수 있는 방법이 있습니까?
답변1
방법 2와 3(ps, top, library 수정)은 취약점을 우회하는 경향이 있습니다. 예를 들어, 공격자는 자신의 ps
.
더 나은 접근 방식은 이러한 도구가 다른 사용자 프로세스에 대한 정보에 액세스하지 못하도록 방지하는 것입니다. 그런 다음 숨기려는 프로세스를 다른 사용자로 실행하십시오.
첫 번째 부분에서는 편집하고 /etc/fstab
포함합니다.
#protect /proc
proc /proc proc defaults,nosuid,nodev,noexec,relatime,hidepid=2,gid=admin 0 0