Hack-The-Box cypher 리뷰
개요
해당 Box는 neo4j의 cypher Query injection을 이용해서 시스템에 로그인한 후 custom function을 분석하여 command injection까지 이어지도록 하는 시나리오 입니다.
neo4j를 사용할 때 cypher query라는걸 이용하는데 이는 그래프 특화 쿼리라고 합니다. SQL query와 비슷하고, injection 포인트가 있기 때문에 공격 코드에 주의를 주는 부분이 있네요.
공격지점
neo4j cypher query는 인젝션 특수문자 필터링을 개발자가 직접 해줘야 하나?
웹 어플리케이션이 SQL을 이용해서 움직이지 않듯이 여러 미들웨어를 결합하여 만들어 질 수 있는 상황에서, 명령어를 그대로 전달하도록 설계하게 되면 이 시나리오와 같이 injection 공격이 일어날 수 있음을 볼 수 있었어요.
cypher query라는 특수한 쿼리문을 사용하게 되는데 SQL injection에 대해서는 옛날부터 유명한 공격이기도 해서 모듈단위로 특수문자 필터링이 기본 장착되는 경우도 많습니다 (JPA를 사용한다면 자동으로 필터링 되도록 한다는 등의)
하지만, 이렇게 미들웨어와 연동하는 시스템을 개발할 때, 특히 custom이 자유롭게 가능하고 쿼리 명령어를 직접 날려야하는 어플리케이션을 연동할 때는 특히 웹 사이트가 제공하는 데이터 이외에 데이터가 들어갈 수 있도록 설계하는건 위험합니다.
개발자는 특히 이런 연동부분을 설게할 땐 필요한 데이터만 요청할 수 있도록, 어플리케이션에서 특정 쿼리만 날릴 수 있도록 통제거나 특수문자를 필터링한다면, 방어할 수 있다고 생각합니다.
또다른 공격포인트 custom 기능이 불특정 다수 혹은 사용자에게 오픈될 경우
custom 기능이 웹 서비스로 오픈될 경우, 그리고 custom기능이 프로그램에서 제공하는 기능 외로 자유도가 높을경우 이를 커스텀하여 서버에 침투가 가능하다는 사실을 알게되었습니다. 레드팀 관점에서는 공격포인트로서 커스텀 기능이 있는지 확인해야 할 것이고, 개발자 관점에서는 사용자가 임의의 코드를 실행하는 것을 막기 위해 비즈니스로직을 명확히 정의해야 할 필요가 있다고 생각합니다.
침투 이후 공격 포인트
이 cypher 시나리오의 의도는 cusmtom module에 권한을 주어질 경우나, 불특정 다수에게 접근권한 없이 공개되어 있을 경우에 대한 위험성을 다루는 것 같아요. 침투 이후엔 bbox라는 오픈소스의 모듈이 sudo 권한을 가지고 있고 해당 어플리케이션이 커스텀 모듈을 제공한다는 점을 이용해서 root를 획득합니다.
느낀점
공격포인트로서 느낀지점은
- 제공하는 웹 어플리케이션 기능이 미들웨어 기능을 전부 다 사용할 수 있도록 설계되어 있는지
- 커스텀 모듈을 제공하여 이를 이용해 공격이 가능한지
부분이었습니다. 이것 이전에 중요한 점은 해당 시스템이 어떤 서비스를 제공하는지 분석하는 스킬을 익힌다면 위와 같은 공격포인트들을 찾을 수 있다고 봅니다.