
David Buchanan의 dlinject 프로젝트를 대폭 수정한 포크입니다. ptrace를 사용하지 않고 /proc/<pid>/mem에 접근하여 임의의 어셈블리(또는 사전 컴파일된 바이너리) 페이로드를 x86-64, x86 및 ARM32 Linux 프로세스에 직접 주입합니다. 특정 포스트 익스플로잇 시나리오, 프로세스 메모리에서 콘텐츠 복구 등에 유용합니다.
asminject.py는 David Buchanan의 dlinject 프로젝트를 대폭 수정한 포크입니다. ptrace로 프로세스에 붙는 대신 /proc/<pid>/mem에 접근하여 임의의 어셈블리(또는 사전 컴파일된 바이너리) 페이로드를 x86-64, x86, ARM32 Linux 프로세스에 직접 주입합니다. 신뢰된 프로세스 변조, 특정 사후 악용(post-exploitation) 시나리오, 프로세스 메모리에서 콘텐츠 복구, 일부 보안 통제 우회에 유용합니다. 컨테이너 외부에서도 호스트에서 root 접근 권한만 있다면 컨테이너화된 프로세스에 주입할 수 있습니다.
또한 Bishop Fox 도구 페이지에서 asminject.py와 그 기원에 대해 더 자세히 읽을 수 있습니다. 이 도구에 영감을 준 작업에 대한 상세 분석도 포함되어 있습니다.
이 문서의 목차:
별도의 더 상세한 문서:
asminject.py는 dlinject와 비슷하지만, 라이브러리만 로드하는 대신 원하는 모든 페이로드를 주입할 수 있고 여러 아키텍처에서 동작합니다."asminject.py는 대략적으로 Frida와 비슷하지만, ptrace 인터페이스를 통해 붙지 않으므로 프로세스가 스스로 ptrace하여 차단할 수 없습니다."asminject.py는 Linux 환경에서의 침투 테스트에서 두 가지 주요 시나리오를 위해 작성되었습니다:
예를 들어, 테스터가 많은 컨테이너를 호스팅하는 서버에 대해 root 접근 권한을 획득한 침투 테스트를 생각해 보십시오. 컨테이너 중 하나는 은행 송금을 처리하며, 그 내부에는 매우 강력한 엔드포인트 보안 제품이 설치되어 있습니다. 침투 테스터가 컨테이너 내부에서 은행 송금 데이터를 수정하려고 하면 엔드포인트 보안 소프트웨어가 이를 탐지하고 차단합니다. asminject.py는 침투 테스터가 컨테이너 외부에서 은행 소프트웨어의 프로세스 메모리나 심지어 엔드포인트 보안 제품 자체에 임의의 코드를 직접 주입할 수 있게 합니다. 데카르트의 "악마"의 희생자처럼, 컨테이너 내부의 보안 소프트웨어는 공격자가 완전히 통제하는 환경에 존재하므로 무력합니다.
원래의 dlinject.py는 Linux 공유 라이브러리를 기존 프로세스에 로드하도록 특별히 설계되었습니다. asminject.py는 원래 도구가 했던 모든 작업과 그 이상을 수행합니다. 임의의 어셈블리 코드를 실행하며 다양한 공격을 위한 템플릿을 포함합니다. 또한 라이브러리 로딩 이벤트와 같은 잠재적으로 의심스러운 활동을 기준으로 삼는 보안 메커니즘의 탐지를 피하는 데 도움이 되도록 재설계되었습니다.
이 저장소의 practice 디렉터리에는 콘솔에 타임스탬프와 루프 반복 횟수를 출력하는 기본 루프 코드가 포함되어 있어 통제된 환경에서 다양한 유형의 코드 주입을 연습할 수 있습니다. 이러한 연습용 루프는 나머지 예제에서 참조됩니다.
asminject.py를 호출하는 기본 구문은 다음과 같습니다:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
대부분의 경우 예제에서 사용된 페이로드는 지원되는 모든 아키텍처에서 실행됩니다.
대부분의 Linux 배포판에는 다른 프로세스에 대해 ptrace 기능을 사용하는 접근을 제어하는 Yama라는 커널 보안 모듈이 포함되어 있습니다. asminject.py는 디버거 인터페이스에 붙지 않지만 여전히 ptrace 기능을 사용할 권한이 필요합니다. 이 기능과 관련된 오류가 발생하면 /proc/sys/kernel/yama/ptrace_scope의 내용을 확인하십시오. 값이 2로 설정된 경우 root로 다음 명령을 실행하십시오:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
3 이상의 값은 재부팅 없이는 해제할 수 없습니다. 그러나 누군가 실수로 /proc/sys/kernel/yama/ptrace_scope를 3으로 설정한 Linux 시스템의 권한 있는 관리자이거나 해당 값이 설정된 환경에 대한 권한 있는 침투 테스트를 수행 중인 경우 ptrace_scope_kernel_module 디렉터리에서 재부팅이 필요 없는 잠재적 해결 방법을 확인하십시오.
gcc 명령을 호출하는 대신 셸코드 어셈블리에 Keystone 사용을 조사.eval 스타일 실행과 대조)가 있는 Python 및 기타 스크립트 인터프리터의 경우, 이 기능을 활용하여 더욱 은밀하게 동작하는 페이로드를 제공.dlinject.py에서 물려받은 현재의 "다음 syscall 후킹" 기법의 대안으로 특정 메서드(또는 주소 등)를 후킹하는 옵션 추가.asminject.py를 사용하여 Frida를 주입하는 방법을 찾는 것이 더 합리적일 수 있습니다 - 더 많은 연구가 필요합니다.asminject.py가 운영자에게 주입할 코드 줄을 요청하고, 주입한 다음 결과 출력을 반환하고, 다시 운영자에게 다른 코드 줄을 요청할 수 있습니다.
asminject.py를 사용하여 프로세스에 Frida를 주입할 수 있다면, 이것도 Frida로 처리하는 것이 더 합리적일 수 있습니다.asminject.py가 실행 중인 프로세서 아키텍처와 일치하지 않는 프로세서 아키텍처에서 실행 중인 대상 프로세스와 상호 작용하는 방법 제공. 예: PCI leech와 같은 하드웨어를 사용하여 원격 장치와 상호 작용, NFS 공유를 통해 root로 접근 가능한 /proc/mem이 있는 장치와 같은 극단적인 모서리 사례 악용 등.