์ ๊ฐ Dalfox ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ ์ Ruby๋ก ์์ฑํ์๋ XSpear๋ ๋๊ตฌ๊ฐ ์์์ต๋๋ค. ๋์ผํ๊ฒ XSS๋ฅผ ํ ์คํ ํ๊ธฐ ์ํ ๋๊ตฌ์๊ณ , ํ์ฌ ์ฑ๋ฅ์ ๋น์ฐํ Dalfox์ชฝ์ด ์๋์ ์ผ๋ก ์ข์ ์ํ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ ๋ถํฐ XSpear์ ๋ํ Reborn ๊ณํ์ ์๊ฐํด ๋์์๋๋ฐ, ์ต๊ทผ ๋ง๋ค๋ ๋๊ตฌ๋ ์ด๋ ์ ๋ ์ค๊ณฝ์ด ์กํ์ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก XSpear์ ๋ํด ๋๊ท๋ชจ ๊ฐํธ์ ์งํํ๋ ค๊ณ ํฉ๋๋ค.
์ค๋์ ์ด๋ค ํํ๋ก XSpear๊ฐ ๋ฐ๋๊ฒ ๋ ์ง ๊ฐ๋จํ๊ฒ ๋ก๋๋งต์ ๊ณต์ ํด ๋ณผ๊น ํฉ๋๋ค.
Why
XSpear๋ ๋ง์ง๋ง ์ปค๋ฐ์ด ์๋ 9์์ด์ง๋ง Github action ์ชฝ์ ๊ฐ๋จํ ๋ณ๊ฒฝ์ผ๋ก ์ ์ง ๋ณด์์ ํ์ํ ์ปค๋ฐ์ ์ ์ธํ๋ฉด ์ฝ 3๋ ์ ๋ ๋ฉ์ถฐ์๋ ํ๋ก์ ํธ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ถฉ์คํ๊ณ ์์ด์ ์ฐ๋๋ฐ ๋ฌธ์ ๋ ํฌ๊ฒ ์๊ฒ ์ง๋ง ์ ์ง๋์ง ์๋ ํ๋ก์ ํธ๋ ์ ์ฐจ ํ์ ์๊ธฐ ๋ง๋ จ์ ๋๋ค.
Roadmap
Ruby to Crystal
๊ฐ์ฅ ํฐ ๋ณํ๋ฅผ ๊ณ ๋ คํ ๊ฒ์ด ๋ฐ๋ก ์ธ์ด์ ๋ณ๊ฒฝ(Ruby -> Crystal)์ ๋๋ค. Ruby๋ ๋ถ๋ช ํ ์ข์ ์ธ์ด์ง๋ง ์๋ ๋ฑ ํ์์ ์ธ ํ๊ณ ๋ํ ์กด์ฌํฉ๋๋ค. ๊ทธ๋์ ๋ฌธ๋ฒ์ ์ธ ์ ์ฌ์ฑ์ ๊ฐํ๊ฒ ๋ ๋ฉด์ ์ปดํ์ผ ์ธ์ด์ธ Crystal๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ ๊ด์ฌ์ด ๋ง์ ์ธ์ด์ด๊ณ ์ต๊ทผ์ ์งํํ CLI ๋๊ตฌ ๊ด๋ จ ํ๋ก์ ํธ๋ Crystal๋ก ์งํํ๊ณ ์์ต๋๋ค. ํนํ Attack Surface ๋ถ์ ๋๊ตฌ์ธ Noir๋ฅผ ๊ฐ๋ฐํ ๋ Crystal์ ์ฌ์ฉํ๊ณ ์์ ๊ต์ฅํ ์ ๋ง์์ ์์ผ๋ก ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ ์์ ์ ๋๋ค.
Noir ๋ ์ด๊ธฐ ๊ตฌ์ฑ์ Go๋ก ๊ตฌํํ๋ค๊ฐ Crystal๋ก ๋ณ๊ฒฝํ๋ฉด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์งํ๋ ํ๋ก์ ํธ์ ๋๋ค.
For Manual Testing
XSpear๋ ์ด๊ธฐ์ ๋ฐฉํฅ์ฑ์ ์ ์งํ์ฌ ๊ฐํธ๋ ๋ฒ์ ๋ํ Manual Testing์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃฐ ์์ ์ ๋๋ค. ์ฌ๋ฌ ํํ์ Input(URL, Form, JSON, DWR, ETC..)์ ์ง์ํ๊ณ ๊ฐ ํ๋ผ๋ฏธํฐ ๋ฑ Fuzzing ํฌ์ธํธ์ ๋ํ ๋ํ ์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค. ์๋ฌด๋๋ Dalfox์ ๋น๊ตํด ๋ณผ ์ ์์ํ ๋ฐ Dalfox๋ ๋๊ท๋ชจ URL์ ๋์์ผ๋ก ๋ณ๋ ฌ ์ค์บ์ ํนํ๋ ๋๊ตฌ๋ผ๋ฉด XSpear๋ ๋จ์ผ ๋์์ ์ฌ์ธต ๋ถ์ํ๊ธฐ ์ํ ๋๊ตฌ๋ก Reborn์ด ๋ชจ๋ ์งํ๋ ์์ ์์ XSpear๊ฐ ๋ ๋ํ ์ผํ ์ ๋ณด๋ฅผ ์ค ์ ์์ ๊ฒ์ผ๋ก ์๊ฐ๋ฉ๋๋ค.
For Exploiting
Dalfox๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ XSS ๋๊ตฌ๋ ํ์ง์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์์ต๋๋ค. ๋๊ฐ์ XSS ์ง๋ง ์ด๋ค ๋ณด์ ๋ฆฌ์คํฌ๋ฅผ ๋ง๋ค๊ณ ์ฆ๋ช ํ๋์ ๋ฐ๋ผ ์ํฅ๋๋ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. Reborn ๊ณผ์ ์ ํต์ฌ ๋ชฉํ ์ค ํ๋๋ Exploit์ ๋ํ ๋ถ๋ถ์ ๋ง์ด ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค. ํ์งํ XSS๋ฅผ ์ฌ์ฉ์์๊ฒ ์๋ฆผ๊ณผ ๋์์ ๊ฐ๋ฅํ Exploiting ๋ฐฉ๋ฒ๋ค์ ํตํด ๋ฆฌ์คํฌ๋ฅผ ์ฌ๋ฆด ์ ์๋์ง ํ ์คํธํ๊ณ ์ ๊ณตํด์ฃผ๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ ๋๋ค.
Input Format
์ ๋ ฅ ํฌ๋งท์ ๋ํด ์๋์ ๊ฐ์ ํํ๋ก ๋ณ๊ฒฝํ ์์ ์ ๋๋ค.
xspear <METHOD> <URL> <OBJECT>
# OBJECT๋ Form, JSON ๋ฑ ์ฌ๋ฌ ๋ฐ์ดํฐ ํ์
์ ์๋ฏธํ๊ณ ์๋์ผ๋ก ํ์ฑํฉ๋๋ค.
# Example: xspear POST https://localhost/search "q=cat" "Cookie: sessions=1234454;"
๊ฐ์ธ์ ์ผ๋ก ๊ต์ฅํ ์ข์ํ๋ http client์ธ HTTPie์์ ๋ง์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋์ ๋น์ทํ ํํ์ Input์ ์ฌ์ฉํ์ฌ ๋ณต์กํ flag ์์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ๊ฟ ์์ ์ ๋๋ค.
XSSMaze
์ด๋ฌํ Reborn์ ์ํด ์ค๋นํ๊ณ ์๋ ๊ฒ์ด ํ๋ ์์์ต๋๋ค. ๋ฐ๋ก XSSMaze์ธ๋ฐ์. ์ฌ๋ฌ ๋ ๋ฒจ๋ณ XSS ์ทจ์ฝ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค๋ก ์ด๋ฅผ ์ด์ฉํ์ฌ ์๋ณํ ์ ์๋ ์ผ์ด์ค๋ฅผ ๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค. ์ด๋ XSpear ๊ฐํธ๊ณผ ๋ณ๊ฐ๋ก Dalfox ๋ํ ๋์ผํ๊ฒ ์ ์ฉํ์ฌ ๋ถ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋๋ฆด ์๊ฐ์ด์์ ๐
Closing Thoughts
์ ๊ฐ ๋ง๋ 2๊ฐ์ ๋๊ตฌ๋ฅผ ๊ฒฝ์์ํค๋ ๊ฒ ๊ฐ์ ํํธ์ผ๋ก ์ด์ง ๋๊ตฌ์ ๋ฏธ์ํ๊ธฐ๋ ํ์ง๋ง ์ฌ๋ฌ๋ชจ๋ก ์ฌ๋ฏธ์๋ ์์ ์ด ๋ ๊ฑฐ๋ ์๊ฐ์ด ๋ค๊ณ ์์ต๋๋ค. Reborn ๊ณผ์ ์ ๋ฆ์ด๋ ์ฌํด ์์ ๋ง๋ฌด๋ฆฌํด์ ๋ง๋๋ณผ ์ ์๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค ๐





