LineCTF(2023) - Baby Simple GoCurl
# Baby Simple GoCurl
๋ฌธ์ ํ์ด์ง์ ์ ์ํ๋ฉด URL, Header Key, Header Value๋ฅผ ์ค์ ํ์ฌ Curl ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค. ์๋จ์๋ ํ์ฌ ๋ด๊ฐ ํ ๋น๋ฐ์ IP์ฃผ์๊ฐ ํ๊ธฐ๋๊ฒ ๋์ด์๋ค.
https://www.naver.com , test, test๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ ์ฒ๋ผ Response๊ฐ ๋ํ๋๋ค.
- GET /flag/
r.GET("/flag/", func(c *gin.Context) {
reqIP := strings.Split(c.Request.RemoteAddr, ":")[0]
log.Println("[+] IP : " + reqIP)
if reqIP == "127.0.0.1" {
c.JSON(http.StatusOK, gin.H{
"message": flag,
})
return
}
c.JSON(http.StatusBadRequest, gin.H{
"message": "You are a Guest, This is only for Host",
})
})
- GET /curl/
r.GET("/curl/", func(c *gin.Context) {
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return redirectChecker(req, via)
},
}
reqUrl := strings.ToLower(c.Query("url"))
reqHeaderKey := c.Query("header_key")
reqHeaderValue := c.Query("header_value")
reqIP := strings.Split(c.Request.RemoteAddr, ":")[0]
fmt.Println("[+] " + reqUrl + ", " + reqIP + ", " + reqHeaderKey + ", " + reqHeaderValue)
if c.ClientIP() != "127.0.0.1" && (strings.Contains(reqUrl, "flag") || strings.Contains(reqUrl, "curl") || strings.Contains(reqUrl, "%")) {
c.JSON(http.StatusBadRequest, gin.H{"message": "Something wrong"})
return
}
req, err := http.NewRequest("GET", reqUrl, nil)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "Something wrong"})
return
}
if reqHeaderKey != "" || reqHeaderValue != "" {
req.Header.Set(reqHeaderKey, reqHeaderValue)
}
resp, err := client.Do(req)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "Something wrong"})
return
}
defer resp.Body.Close()
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "Something wrong"})
return
}
statusText := resp.Status
c.JSON(http.StatusOK, gin.H{
"body": string(bodyText),
"status": statusText,
})
})
์ฒซ ๋ฒ์งธ ์กฐ๊ฑด์ ๋ณด๋ฉด c.ClientIP()๊ฐ 127.0.0.1์ด ์๋๊ณ , requrl ํ๋ผ๋ฏธํฐ์ flag, curl, %์ ๋ฌธ์์ด์ด ํฌํจ๋์ด์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๋๋ก ๋์ด์๋ค.
ํด๋น ๋ถ๋ถ์ ๋ง์กฑ์์ผ ์๋ฒ์์(127.0.0.1) ์ง์ GET /flag ๋ฅผ ํธ์ถํ๋๊ฒ์ ๋ชฉํ๋ก ์ก๊ณ ์งํํ๋ค.
- GET /flag ์์ ํ์ธํ๋ IP flag ํจ์์์ ํ์ธํ๋ IP๋ RemoteAddr() ์ด๋ค. ํด๋น IP๋ ์์ฒญํ Client์ IP๋ฅผ ๊ฐ์ ธ์จ๋ค.
- GET /curl ์์ ํ์ธํ๋ IP curl ํจ์์์ ํ์ธํ๋ IP๋ Go์ c.ClientIP() ์ด๋ค. ํด๋น IP๋ Document์ ๋ฐ๋ฅด๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ ๋ขฐํ ์ ์๋ IP์ธ์ง ํ์ธํ๊ณ ์ ๋ขฐ ๊ฐ๋ฅํ๋ค๋ฉด X-Fowarded-For๋ X-Real-IP ํค๋๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ตฌ๋ฌธ์ ์ผ๋ก ์ ํจํ์ง ์๊ฑฐ๋ ์ ๋ขฐ์ฑ์ด ์๋ค๋ฉด ์๊ฒฉ Client IP์ธ RemoteAddr์ ์ฐธ์กฐํ๋ค.
์ฐธ๊ณ : https://github.com/gin-gonic/gin/blob/v1.9.0/context.go#L771
Request์ X-Fowarded-For ํค๋๋ฅผ ๋ด์์ ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด ์๋ ์ฒ๋ผ c.ClientIP()์์ํด ์ถ๋ ฅ๋๋ IP๊ฐ ๋ณ์กฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
GET /curl/ ํจ์์ IP ์ฒดํฌ๋ ์ฐํ๊ฐ ๋์ด ์ด์ requrl์ flag ๋ฌธ์์ด์ ํฌํจํ์ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
๊ทธ๋ผ ์ด์ ์๋ฒ์์ ์ง์ localhost๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ๋๋ฉด GET /flag์์ ์ฒดํฌํ๋ IP ์กฐ๊ฑด์ธ 127.0.0.1๋ ๋ง์กฑํ ์ ์๋ค.
- GIN ์๋น์ค์ Default Port๊ฐ 8080์ด๋ค.
'๐ก๏ธCTF > LineCTF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LineCTF(2023) - Adult Simple GoCurl (0) | 2023.08.13 |
---|---|
LineCTF 2022 - memo drive (0) | 2022.04.13 |
LineCTF 2022 - gotm (0) | 2022.03.29 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
LineCTF(2023) - Adult Simple GoCurl
LineCTF(2023) - Adult Simple GoCurl
2023.08.13 -
LineCTF 2022 - memo drive
LineCTF 2022 - memo drive
2022.04.13 -
LineCTF 2022 - gotm
LineCTF 2022 - gotm
2022.03.29