
Roniel과 DaRon 팟캐스트 쇼에서 시연된 Super Vulnerable Java Application(SVJA)은 매우 흔한 여러 취약점을 포함하도록 설계된 Apache Struts 애플리케이션입니다. 다른 '의도적으로 취약하게 만든' 소프트웨어와 달리, 이 소프트웨어는 지나치게 단순한 방식이나 'capture the flag' 방식보다는 실제로 흔히 발견되는 방식 그대로 일반적인 취약점을 모방하도록 설계되었습니다. 이 소프트웨어는 반정기적으로 업데이트되고 기능이 추가되며, 팟캐스트의 일부로 일부 취약점에 대한 시연도 포함됩니다.
RDPS Super Vulnerable Java Application은 이름 그대로입니다. 모든 사람이 다양하고 흔하며 종종 "복잡한" 취약점을 살펴볼 수 있도록 만들어진 초취약 Java 애플리케이션입니다. 이 소프트웨어는 Roniel and DaRon Podcast Show (https://www.youtube.com/channel/UCbj1JFcSJeTuf3qf9GPRemA)의 일환으로 제작되었습니다. 온라인에서 볼 수 있는 다른 많은 도구보다 더 현실적인 방식으로 자주 접하는 여러 취약점을 논의하고 보여주기 위해서입니다. 실제 공격 예시를 보려면 저희 팟캐스트를 시청하십시오.
이 애플리케이션은 다양한 문제에 매우 취약하도록 의도되었음을 기억하십시오. 실행 위치에 주의하고, 접근 권한을 제한하십시오(Tomcat 서버는 localhost에서만 수신 대기해야 하며, 항상 개인 머신에서만 실행해야 합니다). 제대로 관리하지 않아 당신의 복사본이 바람에 노출되어 모든 사람이 당신의 데이터를 훔치거나 시스템을 심각하게 손상시키더라도 우리는 책임지지 않습니다. 이 애플리케이션을 안전하고 민감한 내용이 없으며 인터넷에 연결되지 않은 가상 머신(VM)에서 실행할 것을 권장합니다. 이 시스템과 인스턴스를 제대로 보호하지 않으면 결과적으로 좋지 않은 날을 맞이할 가능성이 높습니다. 적절한 보호 장치 없이 가벼운 육체적 관계를 맺는 것과 같이, 당신은 언젠가 후회할 상황에 스스로를 내몰고 있을 뿐입니다. 경고했다는 것을 명심하되, 즐겁게 놀아보세요 ;-)
RDPS SVJA는 react를 실행하는 Java struts 2 애플리케이션으로 구성되어 있습니다. 다음 명령만 실행하면 빌드됩니다: mvn clean package
이렇게 하면 target 폴더에 WAR 파일(svja.war)이 생성됩니다. WAR 파일을 Tomcat의 webapps 폴더에 넣기만 하면 됩니다. 기본 Tomcat 빌드에서는 http://127.0.0.1:8080/svja 로 접속하여 애플리케이션을 사용할 수 있습니다.
Tomcat 10 이상을 사용하는 경우 Tomcat context.xml 설정 파일에 <Loader jakartaConverter="TOMCAT" /> 을(를) 추가하십시오.
시작을 위해 사용하려는 분들을 위해, 루트(http://127.0.0.1:8080/svja)에 Swagger UI와 사용 가능한 기본 OpenAPI 사양(http://127.0.0.1:8080/svja/specification.yaml)이 포함되어 있습니다. 사양과 Swagger UI는 표면만 살짝 보여줄 뿐입니다(안전하지 않은 역직렬화 등이 바로 그런 것이겠죠?).
다음은 시스템의 주요 취약점 중 일부를 동작별로 나열한 것입니다.
admin:admin (application administrator account)
bill:baker (privileged user account)
bob:barker (basic, read-only user account)
/api/authenticate?user.username=admin&user.password=admin
/api/authenticate?user.username=bill&user.password=baker
/api/authenticate?user.username=bob&user.password=barker
인증 후에는 JSON 또는 Struts를 사용하여 원하는 아무 작업이나 호출하십시오.
GET /svja/api/authenticate?user.username=bill&user.password=baker HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Host: localhost
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Length: 0
DNT: 1
Connection: close
Cache-Control: max-age=0
GET /svja/api/authenticate HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Host: localhost
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 61
DNT: 1
Connection: close
Cache-Control: max-age=0
{
"user": {
"username": "bill",
"password": "baker"
}
}
GET /svja/api/authenticate/federated?user.username=bill%40rdps.local&usernameTranslationRegex=%2F%40rdps%5B.%5Dlocal%2F%2F HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Host: localhost
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Length: 0
DNT: 1
Connection: close
Cache-Control: max-age=0
GET /svja/api/authenticate/federated HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Host: localhost
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 61
DNT: 1
Connection: close
Cache-Control: max-age=0
{
"user": {
"username": "[email protected]"
},
"usernameTranslationRegex": "/@rdps[.]local//"
}
svjatoken을 변경해야 합니다.
GET /svja/api/projects?projectId=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Cookie: svjatoken=RaMu5vhFBgL8goV6Ja1ffLnpmcixNuAL7fUP;
Cache-Control: max-age=0
svjatoken을 변경해야 합니다.
GET /svja/api/projects HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: application/json, text/plain, */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 19
DNT: 1
Connection: close
Cookie: svjatoken=RaMu5vhFBgL8goV6Ja1ffLnpmcixNuAL7fUP;
Cache-Control: max-age=0
{
projectId:1
}
이 프로젝트는 작업 진행 중이며, 더 많은 취약점과 계획된 것들(초취약 프론트엔드 및 기타 초취약 애플리케이션 포함)이 있습니다. 두어 달마다 다시 확인하고 Roniel and DaRon Podcast Show를 통해 업데이트, 실제 공격 예시, 그리고 다른 아이디어를 확인하세요. 또한 취약점을 완화하거나 수정하는 방법을 스스로 알아내 보시기를 권장합니다... 무언가를 깨뜨리는 것은 쉽습니다... 완화하고, 수정하고, 보안을 유지하는 것이 어렵죠. 행운을 빕니다. 즐거운 사냥 되세요!