배경
- 취약점을 POC할 때 로컬PC에 Docker 컨테이너를 여러개 구동할 필요가 있다.
- 공격측 컨테이너와 타겟측 컨테이너등을 별도로 구축하는 경우 등이다.
- 이 때 컨테이너들 사이에 통신(주로 HTTP통신)을 할 필요가 있다.
- 타겟서버는 호스트는와 포트를 공유하므로 호스트 입장에서 봤을 때 localhost:포트번호로 접속할 수 있다.
- 문제는 공격측에서 타겟 컨테이너에 접속할 때이다.
상황
- 호스트에서는 localhost:3001 로 웹 서버를 구동하고 있다.
- 컨테이너에서 localhost:3001로 curl을 요청하면 연결되지 않는다. (컨테이너는 구동시에 –net host 옵션을 줬으므로 호스트와 동일한 네트워크에서 동작한다고 상정한다. )
- 처음에는 localhost자체가 127.0.0.1로 이름 해결이 안되는 것으로 판단했지만 curl 127.0.0.1:3001 도 동작하지 않으므로 DNS문제는 아닌 것으로 보인다.
확인
Telnet 이나 Ping으로 확인해보기
telnet으로 확인해보니 3001포트로 접속이 된다! 오호… 그렇다면 curl의 설정이 뭔가 문제가 있는 것 같다.
telnet 127.0.0.1 3001
Connected to 127.0.0.1
해결
-v 옵션(디버그 옵션)으로 실행해보고 원인을 알았다. localhost인데도 프록시 서버에 연결하고 있었다. 다음과 같이 명시적으로 프록시를 공백으로 주는 것으로 해결하였다.
curl -x "" http://localhost:3001
또는 다음과 같이 해도 된다.
curl --noproxy localhost http://localhost:3001
또는 다음과 같이 환경변수를 먼저 지정해준뒤에 실행해도 된다.
no_proxy=127.0.0.1,localhost
curl http://localhost:3001