์๊ฐ
์ฒซ ๋ฒ์งธ ๋ถ๋ถ ์ํธํ๋ SNI(eSNI) ๋ฉ์ปค๋์ฆ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ์ต๋๋ค. ๊ทธ๋ค์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ DPI ์์คํ (Beeline DPI ๋ฐ ๊ธ์ง๋ RKN ๋ฃจํธ ์ถ์ ๊ธฐ์ ์๋ฅผ ์ฌ์ฉํ์ฌ)์ ์ํ ํ์ง๋ฅผ ํํผํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ๋ณด์ฌ์ฃผ๊ณ ์ด ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋๋ฉ์ธ ํ๋ก ํ ์ ์๋ก์ด ๋ฒ์ ๋ ํ์ํ์ต๋๋ค.
๊ธฐ์ฌ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์์๋ RedTeam ์ ๋ฌธ๊ฐ๊ฐ ์ด๋ ค์ด ์์ ์ ์ํํ๋ ๋ฐ ๋์์ด ๋ ๋ณด๋ค ์ค์ฉ์ ์ธ ๋ด์ฉ์ผ๋ก ๋์ด๊ฐ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ฐจ๋จ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋ ๊ฒ์ด ์๋๋๋ค(์ด๋ฐ ์ฌ์ํ ์ผ์ ์ํด ์ฐ๋ฆฌ๋ ์ค๋๋ VPN์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค). ๋คํํ๋ ๋ชจ๋ ์ทจํฅ, ์์, ์์ฐ์ ๋ง๋ ๋งค์ฐ ๋ค์ํ VPN ์ ๊ณต์ ์ฒด๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ Cobalt Strike, Empire ๋ฑ๊ณผ ๊ฐ์ ์ต์ RedTeam ๋๊ตฌ์ ๋๋ฉ์ธ ํ๋ก ํ
๋ฉ์ปค๋์ฆ์ ์ ์ฉํ๊ณ ์ต์ ์ฝํ
์ธ ํํฐ๋ง ์์คํ
์ ๋ชจ๋ฐฉํ๊ณ ํํผํ ์ ์๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค.
์ง๋๋ฒ์ ์ฐ๋ฆฌ๋ eSNI ๋ฉ์ปค๋์ฆ์ OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ตฌํํ๊ณ ์ด๋ฅผ ์น์ํ ์ปฌ ์ ํธ๋ฆฌํฐ์์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค. ํ์ง๋ง ์นํจ ํ ๋ง๋ฆฌ๋ก๋ ๋ง์กฑํ ์ ์๋ค๋ ๋ง์ด ์์ฃ . ๋ฌผ๋ก ๊ณ ๊ธ ์ธ์ด์์๋ ๋น์ทํ ๊ฒ์ ๊ตฌํํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถํํ๋ eSNI ๋ฉ์ปค๋์ฆ์ ๋ํ ์ง์์ GOLANG์์๋ง ์์ ํ ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท์ ํตํ ๋น ๋ฅธ ๊ฒ์์ ์ฐ๋ฆฌ๋ฅผ ์ค๋ง์ํต๋๋ค. ๋ฐ๋ผ์ ์ ํ์ ์ฌ์ง๊ฐ ๋ง์ง ์์ต๋๋ค. ํจ์น๋ OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ C ๋๋ C++๋ก ์์ฑํ๊ฑฐ๋ CloudFlare์์ ๋ณ๋์ GOLANG ํฌํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ตฌ๋ฅผ ๊ฑฐ๊ธฐ๋ก ํฌํ
ํ๋ ค๊ณ ํฉ๋๋ค. ์์น์ ์ผ๋ก Python์ ๋ํ eSNI ์ง์์ ๊ตฌํํ๋ ๋ ๊ณ ์ ์ ์ด์ง๋ง ๋์์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋ ๋ค๋ฅธ ์ต์
์ด ์์ต๋๋ค. ๊ฒฐ๊ตญ Python์ OpenSSL์ ์ฌ์ฉํ์ฌ https๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด ์ต์
์ ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ๋ฐํ๋๋ก ๋จ๊ฒจ๋๊ณ Golang์ ๊ตฌํ์ ๋ง์กฑํ ๊ฒ์
๋๋ค. ํนํ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ํ๋ Cobalt Strike๊ฐ ํ์ฌ ๋๊ตฌ๋ก ๊ตฌ์ถ๋ ํต์ ์ฑ๋(์ธ๋ถ C2 ์ฑ๋)๊ณผ ์๋ฒฝํ๊ฒ ์๋ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. - ์ด์ ๋ํด์๋ ๊ธฐ์ฌ ๋ง์ง๋ง ๋ถ๋ถ์์ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
๋ ์ด์ฌํ ๋ ธ๋ ฅํด๋ณด์ธ์...
Go์์ ๊ตฌํ๋ ๋๊ตฌ ์ค ํ๋๋ ๋คํธ์ํฌ๋ก์ ์ ํ์ ์ํ ๊ฐ๋ฐ์ ๋๋ค. , ๊ทธ๋ฐ๋ฐ ์ด์ Microsoft์ Symantec์ ๋๊ตฌ์์๋ ๊ธ๋ก๋ฒ ์์ ์ฑ์ ๋ฐฉํดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋งค์ฐ ์ ์์ ์ธ ์ํํธ์จ์ด๋ก ๊ฐ์ง๋ฉ๋๋ค.

์ด ๊ฒฝ์ฐ์๋ ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ์ค ์ฒ์์๋ rsockstun์ด ์๋ฒ์์ ๋๊ธฐ์ SSL ํต์ ์ฑ๋ ์ฌ์ฉ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ฐ๊ฒฐ์ด ํ ๋ฒ ์ค์ ๋๊ณ ํฐ๋์ด ์๋ํ๋ ์ ์ฒด ๊ธฐ๊ฐ ๋์ ์กด์ฌํจ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์๋ค์ํผ https ํ๋กํ ์ฝ์ ์ด ์๋ ๋ชจ๋์ฉ์ด ์๋๋๋ค. ์ด๋ ๊ฐ๊ฐ์ ์๋ก์ด http ์์ฒญ์ด ์๋ก์ด TCP ์ฐ๊ฒฐ ๋ด์ ์กด์ฌํ๋ ์์ฒญ-์๋ต ๋ชจ๋์์ ์๋ํฉ๋๋ค.
์ด ๋ฐฉ์์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด http ์์ฒญ์ ๋ณด๋ผ ๋๊น์ง ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋คํ์ค๋ฝ๊ฒ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ง์ ์ต์ ์ด ์์ต๋๋ค. ์ฆ, http ํ๋กํ ์ฝ์ ํตํ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ(๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ๋ ์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ TV ํ๋ก๊ทธ๋จ์ ์์ฒญํ๊ณ https์์ ์คํ๋๋ ํฌํธ์์ ์์ ์ ๋ค์ ์ ์์ง๋ง ๋น๋์ค ๋ฐ ์ค๋์ค ์ ์ก์ ๋ค๋ฅธ ๊ฒ์ด ์๋๋๋ค. ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ณด๋ค). HTTP ํ๋กํ ์ฝ์ ํตํด ๋ณธ๊ฒฉ์ ์ธ TCP ์ฐ๊ฒฐ ์์ ์ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ธฐ์ ์ค ํ๋๋ WebSockets ๊ธฐ์ ์ด๋ฉฐ, ์ด ๊ธฐ์ ์ ์ฃผ์ ๋ณธ์ง์ ํด๋ผ์ด์ธํธ์ ์น ์๋ฒ ๊ฐ์ ๋ณธ๊ฒฉ์ ์ธ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
์ด ์ข๊ฒ๋(๋ง์ธ!!!) ์ด ๊ธฐ์ ์ ๋ชจ๋ CloudFlare ์๊ธ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด ์์ผ๋ฉฐ eSNI์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํฐ๋๋ฌ์๊ฒ ๋๋ฉ์ธ ํ๋ก ํ ์ ์ฌ์ฉํ๊ณ ์ต์ DPI๋ก๋ถํฐ ์จ๊ธฐ๋๋ก ๊ฐ๋ฅด์น๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
WebSocket์ ๋ํด ์กฐ๊ธ
์ฐ์ , ๋ชจ๋ ์ฌ๋์ด ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๋ํ ์์ด๋์ด๋ฅผ ๊ฐ์ง ์ ์๋๋ก ์น์์ผ์ ๋ํด ๊ฐ๋จํ๊ณ ๊ฐ๋จํ ๋ง๋ก ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
Websocket ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ์ค์ ๋ TCP ์ฐ๊ฒฐ์ ๋์ง ์๊ณ ์ผ์์ ์ผ๋ก http ์ฐ๊ฒฐ์์ ํ์ค ๋คํธ์ํฌ ์์ผ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์น์์ผ์ผ๋ก ์ ํํ๋ ค๊ณ ํ๋ฉด http ์์ฒญ์ ์ฌ๋ฌ http ํค๋๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ๊ฐ์ ํ์ ํค๋ - ์ฐ๊ฒฐ: ์ ๊ทธ๋ ์ด๋ ะธ ์ ๊ทธ๋ ์ด๋: ์น์์ผ. ๋ํ ์น์์ผ ํ๋กํ ์ฝ ๋ฒ์ ์ ๊ฐ์ ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค(Sec-Websockset-๋ฒ์ : 13) ๋ฐ base64 ์น์์ผ ์๋ณ์(Sec-WebSocket-ํค: DAGDJSiREI3+KjDfwxm1FA==). ์๋ฒ๋ http ์ฝ๋ 101 ์ค์์นญ ํ๋กํ ์ฝ๋ก ๊ทธ์๊ฒ ์๋ตํ๊ณ ํค๋๋ ์ค์ ํฉ๋๋ค. ์ฐ๊ฒฐ, ์ ๊ทธ๋ ์ด๋ ะธ Sec-WebSocket-์๋ฝ. ์ ํ ํ๋ก์ธ์ค๋ ์๋ ์คํฌ๋ฆฐ์ท์ ๋ช ํํ๊ฒ ๋์ ์์ต๋๋ค.

๊ทธ๋ฌ๋ฉด WebSocket ์ฐ๊ฒฐ ์ค์น๊ฐ ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ด์ http๊ฐ ์๋ WebSocket ํค๋(๋ฐ์ดํธ 0x82๋ก ์์)์ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ์ด์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์ ์ก ์์ฒญ์ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ต๋๋ค. TCP ์ฐ๊ฒฐ์ด ๋์ด์ง์ง ์์์ต๋๋ค.
Golang์๋ ์น์์ผ ์์ ์ ์ํ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ์ธ๊ธฐ์๋ ๊ฒ์ ํ์ค . ์ฐ๋ฆฌ๋ ํ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์... ๋ ๊ฐ๋จํ๊ณ ์์ผ๋ฉฐ ๊ทธ๋ค์ด ๋งํ๋ ๊ฒ์ฒ๋ผ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
rsockstun ํด๋ผ์ด์ธํธ ์ฝ๋์์ net.dial ๋๋ tls.dial ํธ์ถ์ ํด๋น WebSocket ํธ์ถ๋ก ๋ฐ๊ฟ์ผ ํฉ๋๋ค.


์ฐ๋ฆฌ๋ ํฐ๋์ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ ๋ฒ์ฉ์ผ๋ก ๋ง๋ค๊ณ ์ง์ SSL ์ฐ๊ฒฐ๊ณผ WebSockset ํ๋กํ ์ฝ์ ํตํด ๋ชจ๋ ์๋ํ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ณ๋์ ํจ์๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค. func connectForWsSocks(์ฃผ์ ๋ฌธ์์ด, ํ๋ก์ ๋ฌธ์์ด) ์ค๋ฅ {...} ๋น์ ๋ก ์ปค๋ฅํธํฌ์ญ์ค() ํด๋ผ์ด์ธํธ๋ฅผ ์์ํ ๋ ์ง์ ๋ ์๋ฒ ์ฃผ์๊ฐ ws: ๋๋ wss:(Secure WebSocket์ ๊ฒฝ์ฐ)๋ก ์์ํ๋ ๊ฒฝ์ฐ ์น ์์ผ ์์
์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํฐ๋์ ์๋ฒ ์ธก์์๋ ์น ์์ผ ์์ ์ ์ํ ๋ณ๋์ ๊ธฐ๋ฅ๋ ๋ง๋ค ๊ฒ์ ๋๋ค. http ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ http ์ฐ๊ฒฐ ํธ๋ค๋ฌ(wsHandler ํจ์)๋ฅผ ์ค์ ํฉ๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฐ๊ฒฐ ์ฒ๋ฆฌ ๋ก์ง(๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ์ธ์ฆ, yamux ์ธ์
์ค์ ๋ฐ ์ข
๋ฃ)์ WebSocket ์ฐ๊ฒฐ ํธ๋ค๋ฌ์ ๋ฐฐ์นํฉ๋๋ค.

ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํ๊ณ ์๋ฒ ๋ถ๋ถ์ ์์ํฉ๋๋ค.
./rsockstun โlisten ws:127.0.0.1:8080 โpass P@ssw0rd๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
./rsockstun -connect ws:127.0.0.1:8080 โpass P@ssw0rd๊ทธ๋ฆฌ๊ณ ๋ก์ปฌ ํธ์คํธ์์ ์์ ์ ํ์ธํฉ๋๋ค.


๋๋ฉ์ธ ํ๋ก ํ ์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์น์์ผ์ ์์๋ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ eSNI ๋ฐ ๋๋ฉ์ธ ํ๋ก ํ ์ผ๋ก ์ง์ ์ด๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด DoH ๋ฐ eSNI์ ํ๋ ฅํ๋ ค๋ฉด ํ์ฌ์์ ํน๋ณํ golang ์ง์ ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. . eSNI๋ฅผ ์ง์ํ๋ ์ง์ (pwu/esni)์ด ํ์ํฉ๋๋ค.
๋ก์ปฌ๋ก ๋ณต์ ํ๊ฑฐ๋ ํด๋น zip์ ๋ค์ด๋ก๋ํ์ฌ ์์ถ์ ํ๋๋ค.
git clone -b pwu/esni https://github.com/cloudflare/tls-tris.git๊ทธ๋ฐ ๋ค์ GOROOT ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณต์ฌํ๊ณ ๋ณต์ ๋ ๋ถ๊ธฐ์์ ํด๋น ํ์ผ์ ๊ต์ฒดํ๊ณ ์ด๋ฅผ ๋ง์คํฐ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ณจ์น ์ํ ๋ฌธ์ ๋ก๋ถํฐ ๊ฐ๋ฐ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด CloudFlare ์ง์์ ํน๋ณํ ์คํฌ๋ฆฝํธ์ธ _dev/go.sh๋ฅผ ์ค๋นํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์ํฉ๋๋ค. makefile๊ณผ ํจ๊ป ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๊ฒ์ ์ค์ค๋ก ์ํํฉ๋๋ค. ์ฌ๋ฏธ์ผ์ makefile ๋ด๋ถ์์ ์์ธํ ๋ด์ฉ์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ํ ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํ ๋ ์คํฌ๋ฆฝํธ์์ ์ค๋นํ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ๋ฅผ GOROOT๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" go build โฆ.๋ค์์ผ๋ก, ์ํ๋ ๋๋ฉ์ธ์ ๋ํ ๊ณต๊ฐ eSNI ํค๋ฅผ ์์ฒญํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ธฐ๋ฅ์ ํฐ๋์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ด๋ CloudFlare ํ๋ฐํธ์๋ ์๋ฒ์ ๊ณต๊ฐ eSNI ํค์ ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ง๋ญ๋๋ค.
func makeDoTQuery(dnsName string) ([]byte, error)
func parseTXTResponse(buf []byte, wantName string) (string, error)
func QueryESNIKeysForHost(hostname string) ([]byte, error)์์น์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ด๋ฆ์ ๊ทธ ์์ฒด๋ก ๋ํ๋ฉ๋๋ค. tls-tris์ ์ผ๋ถ์ธ esni_query.go ํ์ผ์์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ DoH(DNS-over-HTTPS) ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ CloudFlare DNS ์๋ฒ์ ๋ํ ์์ฒญ์ผ๋ก ๋คํธ์ํฌ ํจํท์ ์์ฑํ๊ณ , ๋ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๋๋ฉ์ธ์ ๊ณต๊ฐ ํค ๊ฐ์ ๊ฐ์ ธ์ค๊ณ , ์ธ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์ฒ์ ๋ ๊ฐ๋ฅผ ์ํ ์ปจํ ์ด๋์ ๋๋ค.
๋ค์์ผ๋ก ์๋ก ์์ฑ๋ ํจ์์ ์น ์์ผ ์ฐ๊ฒฐ์ ์ถ๊ฐํฉ๋๋ค. connectForWs์๋ง ๋๋ฉ์ธ์ ๋ํ eSNI ํค๋ฅผ ์์ฒญํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์๋ฒ ๋ถ๋ถ์ด ์๋ํ๋ ๊ฒฝ์ฐ TLS ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๊ณ ๊ฐ์ง "์ปค๋ฒ ๋๋ฉ์ธ"์ ์ด๋ฆ๋ ์ค์ ํฉ๋๋ค.

์ฌ๊ธฐ์๋ ์ฒ์์ tls-tris ๋ถ๊ธฐ๊ฐ ๋๋ฉ์ธ ํ๋ก ํ
์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ง ์์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ง ์๋ฒ ์ด๋ฆ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์ต๋๋ค(๋น serverName ํ๋๊ฐ client-hello ํจํท์ ์ผ๋ถ๋ก ์ ์ก๋จ). ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํด๋น FakeServerName ํ๋๋ฅผ TlsConfig ๊ตฌ์กฐ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ตฌ์กฐ์ ํ์ค ServerName ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ด๋ถ TLS ๋ฉ์ปค๋์ฆ์ ์ํด ์ฌ์ฉ๋๋ฉฐ ์๋ ๋ฉ์ปค๋์ฆ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ TLS ํธ๋์
ฐ์ดํฌ๋ ์ค๋ฅ์ ํจ๊ป ์ข
๋ฃ๋ฉ๋๋ค. TlsConfig ๊ตฌ์กฐ์ ๋ํ ์ค๋ช
์ ํ์ผ์ ํฌํจ๋์ด ์์ต๋๋ค. TLS/common.go - ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ณ ์ณ์ผ ํฉ๋๋ค:


๋ํ ํ์ผ์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. tls/handshake_client.goTLS ํธ๋์
ฐ์ดํฌ๋ฅผ ๊ตฌ์ฑํ ๋ FakeServerName ํ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.

๊ทธ๊ฒ ๋ค์ผ! ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํ๊ณ ์์
๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์บ์ ์คํํ๊ธฐ ์ ์ CloudFlare ๊ณ์ ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ธ์์, ์ด๋ป๊ฒ ์ค์ ํ๋ค๊ณ ๋งํ ์ ์์๊น์? cloudflare์ ๊ณ์ ์ ๋ง๋ค๊ณ ๋๋ฉ์ธ์ ์ฌ๊ธฐ์ ์ฐ๊ฒฐํ๋ฉด ๋ฉ๋๋ค. DoH, WebSocket ๋ฐ ESNI์ ๊ด๋ จ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก CloudFlare์ ํฌํจ๋์ด ์์ต๋๋ค. DNS ๋ ์ฝ๋๊ฐ ์
๋ฐ์ดํธ๋ ํ eSNI ํค๋ฅผ ์ฟผ๋ฆฌํ์ฌ ๋๋ฉ์ธ์ ์๋์ ํ์ธํ ์ ์์ต๋๋ค.
dig +short txt _esni.df13tester.info 
๊ทํ์ ๋๋ฉ์ธ๊ณผ ๋น์ทํ ๊ฒ์ด ๋ณด์ด๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ๊ณ ํ
์คํธ๋ฅผ ์งํํ ์ ์๋ค๋ ์๋ฏธ์
๋๋ค.
์์ํ๋ค Ubuntu ์๋ฅผ ๋ค์ด DigitalOcean์ VPS๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ฐธ๊ณ ๋ก, ์ ํฌ์ ๊ฒฝ์ฐ ์ ๊ณต์ ์ฒด๋ก๋ถํฐ ๋ฐ์ VPS IP ์ฃผ์๊ฐ ๋ฌ์์ ์ฐ๋ฐฉ ํต์ ๊ฐ๋ ์ฒญ(Roskomnadzor)์ ๋ธ๋๋ฆฌ์คํธ์ ์ฌ๋ผ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ๋น์ทํ ์ผ์ด ๋ฐ์ํ๋๋ผ๋ ๋๋ผ์ง ๋ง์ธ์. ์ ๋ VPS์ ์ ์ํ๊ธฐ ์ํด VPN์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
์ด๋ฏธ ์ปดํ์ผ๋ rsockstun์ VPS์ ๋ณต์ฌํ๊ณ (์ด๊ฒ์ Golang์ ๋ ๋ค๋ฅธ ์ฅ์ ์ ๋๋ค. ์์คํ ์ ๋นํธ ์ฉ๋๋ง ๊ด์ฐฐํ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ์ง์ ์ปดํ์ผํ๊ณ ๋ชจ๋ Linux์์ ์คํํ ์ ์์ต๋๋ค) ์๋ฒ ๋ถ๋ถ์ ์์ํฉ๋๋ค.

๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

๋ณด์๋ค์ํผ ํด๋ผ์ด์ธํธ๋ websocket์ ์ฌ์ฉํ์ฌ CloudFlare ํ๋ฐํธ์๋ ์๋ฒ๋ฅผ ํตํด ์๋ฒ์ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋์์ต๋๋ค. ํฐ๋์ด ํฐ๋๊ณผ ์ ํํ ๋์ผํ๊ฒ ์๋ํ๋์ง ํ์ธํ๋ ค๋ฉด ์๋ฒ์์ ์ด์ด ๋ก์ปฌ sock5๋ฅผ ํตํด ์ปฌ ์์ฒญ์ ํ ์ ์์ต๋๋ค.

์ด์ DPI๊ฐ ํต์ ์ฑ๋์์ ๋ฌด์์ ๋ณด๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.

๋จผ์ , DoH ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ํฐ๋๋ฌ๋ ๋์ ๋๋ฉ์ธ(ํจํท ๋ฒํธ 1-19)์ eSNI ํค๋ฅผ ์ํด Cloudflare DNS ์๋ฒ์ ์ ์ํ ๋ค์ ํ๋ฐํธ์๋ ์๋ฒ์ ์ ์ํ๊ณ ๋๋ฉ์ธ ๋ค์ ์จ์ด TLS ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค. (ํด๋ผ์ด์ธํธ ์์ ์ ๊ฐ์ง ๋๋ฉ์ธ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ๊ฐ์
๋๋ค.) ๊ฐ์ง ๋๋ฉ์ธ์ ์ง์ ํ๋ ค๋ฉด -fronfDomain ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
![]()

์ด์ ํ ๊ฐ์ง ๋. ๊ธฐ๋ณธ์ ์ผ๋ก CloudFalre ๊ณ์ ์ค์ ์ ์ ์ฐํ SSL๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ์์ Cloudflare ํ๋ฐํธ์๋ ์๋ฒ๋ก ๋ณด๋ด๋ https ์์ฒญ์ด ์ํธํ๋์ง ์์(http) ์๋ฒ๋ก ์ ๋ฌ๋๋ค๋ ์๋ฏธ์
๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํฐ๋์ ์๋ฒ ๋ถ๋ถ์ ๋น SSL ๋ชจ๋( -listen ws:0.0.0.0)๊ฐ ์๋( -listen wss:0.0.0.0)์์ ์์ํ ์ด์ ์
๋๋ค.

์ ์ฒด ์ํธํ ๋ชจ๋๋ก ์ ํํ๋ ค๋ฉด ๋ค์์ ์ ํํด์ผ ํฉ๋๋ค. ๊ฐ๋ ์ฐฌ๋๋ ์ ์ฒด(์๊ฒฉ) ์๋ฒ์ ์ค์ ์ธ์ฆ์๊ฐ ์๋ ๊ฒฝ์ฐ. ๋ชจ๋๋ฅผ ์ ํํ๋ฉด https ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ CloudFlare์ ์ฐ๊ฒฐ์ ์๋ฝํ ์ ์์ต๋๋ค. ํฐ๋์ ์๋ฒ์ธก์ ๋ํด ์์ฒด ์๋ช
๋ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.

ํธ๊ธฐ์ฌ ๋ง์ ๋
์๋ ์ด๋ ๊ฒ ์ง๋ฌธํ ๊ฒ์
๋๋ค. "๊ทธ๋ผ ์๋ ๊ณ ๊ฐ์ ์ด๋ป๊ฒ ๋๋ ๊ฑฐ์ฃ ?" Windows"๊ฒฐ๊ตญ ํฐ๋๋ฌ์ ์ฃผ๋ ์ฉ๋๋ ํ์ฌ ์ปดํจํฐ์ ์๋ฒ์์ ๋ฐฑ์๋ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ๊ฒ์ธ๋ฐ, ์ด๋ฌํ ์์คํ
์ ๋๊ฐ Windows์
๋๋ค. ํน์ TLS ์คํ์ ์ฌ์ฉํ์ฌ Windows์ฉ ํฐ๋๋ฌ๋ฅผ ์ด๋ป๊ฒ ์ปดํ์ผํ ์ ์์๊น์?" ์ด์ Golang์ ํธ๋ฆฌํจ์ ๋ณด์ฌ์ฃผ๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์๊ฐํ๊ฒ ์ต๋๋ค. Kali Linux์์ GOOS=windows ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด Windows์ฉ์ผ๋ก ์ง์ ์ปดํ์ผํ ์ ์์ต๋๋ค.
GOARCH=amd64 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"๋๋ 32๋นํธ ๋ฒ์ :
GOARCH=386 GOROOT="/opt/tls-tris/_dev/GOROOT/linux_amd64" GOOS=windows go build -ldflags="-s -w"๋ชจ๋! ๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ๋ฒ๊ฑฐ๋ก์์ด ํ์ํ์ง ์์ต๋๋ค. ์ค์ ๋ก ์๋ํ๋ค!

โw ๋ฐ โs ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์คํ ํ์ผ์์ ๋ถํ์ํ ์ฐ๋ ๊ธฐ๋ฅผ ์ ๊ฑฐํ์ฌ ๋ช ๋ฉ๊ฐ๋ฐ์ดํธ ๋ ์๊ฒ ๋ง๋๋ ๋ฐ ํ์ํฉ๋๋ค. ๋ํ UPX๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์งํ์ฌ ํฌ๊ธฐ๋ฅผ ๋์ฑ ์ค์ผ ์ ์์ต๋๋ค.
๋์ ๊ฒฐ๋ก
๊ธฐ์ฌ์์ Golang์ผ๋ก ์์ฑ๋ ํฐ๋์ ์๋ฅผ ์ฌ์ฉํ์ฌ TLS 1.3 ํ๋กํ ์ฝ์ ๋ค์ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์๋ก์ด ๋๋ฉ์ธ ํ๋ก ํ ๊ธฐ์ ์ ์ฌ์ฉ์ ๋ช ํํ๊ฒ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋น์ทํ ๋ฐฉ์์ผ๋ก Golang์ผ๋ก ์์ฑ๋ ๊ธฐ์กด ๋๊ตฌ๋ฅผ ์กฐ์ ํ์ฌ CloudFlare ์๋ฒ๋ฅผ ํตํด ์๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด - ์ ๋ช ํ C2 ๋๋ Teamserver๋ฅผ ํตํด ์์ ํ ๋ CobaltStrike Beacon์ด eSNI ๋๋ฉ์ธ ํ๋ก ํ ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํฉ๋๋ค. , Golang์์ ๊ตฌํ๋๊ฑฐ๋ ๊ธฐ์ฌ ๋ง์ง๋ง ๋ถ๋ถ์์ ์ค๋ช ํ OpenSSL ํจ์น ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ํ์ค C++์์ ๊ตฌํ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์๋ ฅ์๋ ์ ํ์ด ์์ต๋๋ค.
ํฐ๋๋ฌ์ CloudFlare์ ์๋ ๊ฐ๋ ์ ํํ๋ก ์ ์๋์ด ์์ผ๋ฉฐ ์ด๋ฌํ ์ ํ์ ๋๋ฉ์ธ ํ๋ก ํ ์ ์ฅ๊ธฐ์ ์ธ ์ ๋ง์ ๋ํด ๋งํ๊ธฐ๋ ์ฌ์ ํ ์ด๋ ต์ต๋๋ค. ํ์ฌ CloudFlare๋ง์ด eSNI๋ฅผ ์ง์ํ๋ฉฐ ์ด๋ก ์ ์ผ๋ก ์ด๋ฌํ ์ข ๋ฅ์ ํ๋ก ํ ์ ๋นํ์ฑํํ๋ ๊ฒ์ ๋ง์ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด SNI์ eSNI๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด TLS ์ฐ๊ฒฐ์ด ๋์ด์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฏธ๋๊ฐ ๋งํด ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ "kremlin.ru ํ์ง" ์๋์์ ์์ ํ ๊ฐ๋ฅ์ฑ์ด ๊ฝค ๋งค๋ ฅ์ ์ผ๋ก ๋ณด์ ๋๋ค. ์ ๊ทธ๋?
์
๋ฐ์ดํธ๋ ํฐ๋๋ฌ ์ฝ๋์ ์ปดํ์ผ๋ ์คํ ํ์ผ์ ๋ค์ ํ๋ก์ ํธ์ ๋ณ๋ ๋ถ๊ธฐ์ ์์ต๋๋ค. . GitHub์ ํ๋ก์ ํธ ํ์ด์ง์ ๊ฐ๋ฅํ ๋ชจ๋ ํฐ๋๋ฌ ๋ฌธ์ ์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ถ์ฒ : habr.com
