---
# System prepended metadata

title: linux-mint-system-hardening

---

# linux-mint-system-hardening
![image](https://hackmd.io/_uploads/BJIswzq9lg.png)
> https://docs.google.com/document/d/1hW5BLLi1i3FN4SRWhx_7ZPefPjJhHNS2R2DLusmJKRI/edit?usp=sharing
> https://drive.google.com/file/d/1dQfLPgzDq-iaXBCNLLrgDsWxYtpTWbDP/view?usp=drive_link 
> https://drive.google.com/file/d/1dQfLPgzDq-iaXBCNLLrgDsWxYtpTWbDP/view?usp=drive_link 
> https://drive.google.com/file/d/1-E0ikeIQbfrCrNRGJAbX0Acn4NNjhXLq/view?usp=drive_link 
> https://drive.google.com/file/d/1rr76YQHjOenzFdoUT_dQRPUBhSBUlf8L/view?usp=sharing

```bash!
ImaginaryCTF 2025 - Syshardening 11
OS: Mint 22

Scenario Layout
Welcome to the official Studio Ghibli SMB server! This server is set up a bit
unconventionally as it will act as both a development workspace but will utilize SMB file
share. Samba will be used to serve important source code files (anonymous enabled,
read only) with simultaneous SSH access to let users connect and use the Python
development space.

Company Policy
Company policy is to prohibit hacking tools, games, media files, malware, backdoors, or
generally unwanted software but last week Howl already used his magic to keep this
policy in check after the events of our last breach. Your mission will be mainly targeted
more toward system hardening and workspace setup to close off any vulnerabilities and
ensure this server acts as a functional SMB server and development workspace. The
users of this machine will primarily be using both pip and apt package managers, so
please keep the workspace policy in mind when managing these package managers. For
apt management, please use the configuration file /etc/apt/apt.conf.d/99custom for
ANY CONFIGURATION. Make sure SSH uses pubkey based authentication. Samba file
share (code) is at /srv/samba/public, default credentials for Samba are used.
Additionally, please make sure the latest stable version of (standard) opencv isinstalled only for the user totoro. Chutotoro needs it to code a new Limelight CV
pipeline for FTC DECODE™ (And also to detect horrible AI ghibli pfps). Make sure
this is installed for Lastly, please ensure that system passwords are hashed with
YESCRYPT.
Critical Services
Samba (SMB)
OpenSSH (SSH)
Administrators
totoro (you) Password: password
kiki Password: D3l1v3ry$$$
howl Password: C@5tle123
chihiro Password: Yubab@5ucks
Authorized Users
marco
jiro
nahoko
jiji
chutotoro
chibitotoro
sophie
haku
satsuki
catbus
calcifer
sosuke
ponyo
mononoke
mahito
```

---


> **Kịch Bản:** Máy chủ Mint 22 vừa bị “crack”. Máy đóng vai trò **SMB (ẩn danh, read-only)** + **máy dev (Python/pip)**, đồng thời yêu cầu **SSH bằng khóa công khai**. 
> **Nhiệm vụ:** trả lời 8 câu hỏi và thực hiện một số **biện pháp hardening** (YESCRYPT, SSH hardening, Samba cấu hình đúng, OpenCV chỉ cho user `totoro`, v.v.)..

![image](https://hackmd.io/_uploads/SkQJLI6qxg.png)
> Pass: password

![image](https://hackmd.io/_uploads/H1kcLUT5lg.png)
> Truy cập vào giao diện của user chính, nhiệm vụ của mình là điều tra và trả lời 8 FQ ở desktop trước, sau đó là hardening để thỏa mãn điều kiện có điểm ở file scoring:

![image](https://hackmd.io/_uploads/r1W7DLa9gg.png)






## I. Điều tra và trả lời các câu hỏi

1. **Recon nhanh hệ thống**
```bash!
uname -a; lsb_release -a
id; groups
date; uptime
```
![image](https://hackmd.io/_uploads/SJ2qv869gx.png)
```bash!
totoro@studio:~$ uname -a; lsb_release -a
id; groups
date; uptime
Linux studio 6.14.0-29-generic #29~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Aug 14 16:52:50 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 22.2
Release:	22.2
Codename:	zara
uid=1000(totoro) gid=1000(totoro) groups=1000(totoro),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),105(lpadmin),125(sambashare)
totoro adm cdrom sudo dip plugdev users lpadmin sambashare
Tue Sep  9 12:30:14 AM PDT 2025
 00:30:14 up 7 min,  1 user,  load average: 0.58, 0.48, 0.25
totoro@studio:~$ 
```
   
2. **Đếm dịch vụ, startup, SUID/SGID, file mới sửa**

```bash!
systemctl list-unit-files --type=service --no-pager
systemctl status --no-pager | sed -n '1,200p'
find / -perm -4000 -type f -xdev 2>/dev/null
find / -type f -mtime -7 -printf "%TY-%Tm-%Td %TT %p\n" 2>/dev/null | sort -r | head
```

```bash!
totoro@studio:~$ systemctl list-unit-files --type=service --no-pager
systemctl status --no-pager | sed -n '1,200p'
find / -perm -4000 -type f -xdev 2>/dev/null
find / -type f -mtime -7 -printf "%TY-%Tm-%Td %TT %p\n" 2>/dev/null | sort -r | head
...
```

3. **Tập trung vào “dấu hiệu câu hỏi”**: Desktop, log web, systemd, kernel modules, browser history, audio file, 7z “handout”.

---

### Q1 — SSH banner rò rỉ mật khẩu thuần (plaintext)

**Câu hỏi:** “Có file bị rò rỉ plaintext password và có thể dùng làm SSH banner. Đường dẫn đầy đủ là gì?”

**Cách làm:**

* Kiểm tra **banner** của SSH:

  ```bash
  grep -E 'Banner|PrintMotd' -n /etc/ssh/sshd_config
  sudo grep -RniE 'password|passwd|shadow|secrets' /home /etc 2>/dev/null | head
  ```
  ![image](https://hackmd.io/_uploads/SJ9jyF0clx.png)

* Lần theo kết quả vào thư mục **home của user khả nghi** (ở đề này là `fujimoto`). Bên trong có một cây thư mục “ẩn giấu” nhiều cấp dẫn tới **secrets.txt** chứa thông tin nhạy cảm.




> /home/fujimoto/.../.../.../secrets.txt


**Vì sao quan trọng:** Banner/motd chạy trước đăng nhập có thể vô tình lộ dữ liệu nhạy cảm, đặc biệt khi **SSH cho phép password auth**

**Khắc phục:** Xóa/di chuyển file rò rỉ; không dùng banner chứa thông tin nhạy cảm; đảm bảo `PasswordAuthentication no`, `KbdInteractiveAuthentication no`.

---

### Q2 — Nhạc tự chạy khi boot (dịch vụ khởi chạy)

**Câu hỏi:** “Cái gì chạy nhạc khi boot? (tên file component chạy lệnh phát nhạc)”

**Cách làm:**

* Dò các service “ngoài luồng” trong `/etc/systemd/system`:

  ```bash
  systemctl list-unit-files --type=service --no-pager | grep -i update
  ls -l /etc/systemd/system/
  sed -n '1,120p' /etc/systemd/system/updates.service
  ```
  ![image](https://hackmd.io/_uploads/SkinZYC9xe.png)

Tuy nhiên lúc mình sub `updates.service` thì không đúng, hỏi lại author:
![image](https://hackmd.io/_uploads/ryHQzY05xg.png)
![image](https://hackmd.io/_uploads/BJ0VMYAqxg.png)

> /etc/systemd/system/updates.service


**Vì sao quan trọng:** Tác nhân dai dẳng (persistence) hay ẩn trong systemd.

**Khắc phục:** `systemctl disable --now updates.service` và xoá file service nếu không cần.

---

### Q3 — File tải đầu tiên từ browser history archive

**Câu hỏi:** “Trong archive history ở Desktop: file được tải **đầu tiên** là gì?”

Câu này chỉ việc giải nén file zip ở desktop và tìm file `places.sqlite`
![image](https://hackmd.io/_uploads/BJUq4tC5ll.png)

![image](https://hackmd.io/_uploads/SkUuNF0qgx.png)


> FileZilla_3.65.0_x86_64-linux-gnu.tar.xz

---

### Q4 — Mật khẩu backdoor trên webserver (log ở Desktop)

**Câu hỏi:** “Mật khẩu backdoor dùng để truy cập trái phép?”

**Cách làm:**

* Mở log web trên Desktop và tìm các chuỗi khác thường/ payload:

* Thấy chuỗi **`justforfun`** nằm trong payload/URL đặc thù của backdoor.
![image](https://hackmd.io/_uploads/BkigSKR9ee.png)


> justforfun

**Vì sao quan trọng:** Webshell/backdoor hay nhúng “mật khẩu” trong tham số GET/POST hoặc tên tệp.

**Khắc phục:** Xoá webshell, vá lỗ hổng upload/RCE, thêm WAF/ModSecurity, bật logging/alert bất thường.

---

### Q5 — Nhị phân “đọc/ghi mọi file” do **SUID** sai

**Câu hỏi:** “Có nhị phân cho phép user thường đọc/ghi toàn bộ hệ thống do misconfigured permission. MD5 của nhị phân là gì?”
*(Trong bản chấm thực tế, engine chấp câu trả lời là **đường dẫn** nhị phân.)*

**Cách làm:**

* Liệt kê SUID:

  ```bash
  find / -perm -4000 -type f -xdev 2>/dev/null
  ls -l /usr/bin/cat
  md5sum /usr/bin/cat
  ```
  ![image](https://hackmd.io/_uploads/BywEHtR9gl.png)

* Ở ảnh này, **`/usr/bin/cat`** bị setuid (hoặc cho phép truy cập tuỳ check) → user thường có thể đọc/ghi file hệ thống.
![image](https://hackmd.io/_uploads/Sy48rtRceg.png)


```
/usr/bin/cat
```
---

### Q6 — Kernel module đáng ngờ: **tác giả** là ai?

**Câu hỏi:** “Tên tác giả (author) của kernel module khả nghi?”

**Cách làm:**

* Tìm module “lạ” ở thư mục **extra/updates**:

  ```bash
  moddir="/lib/modules/$(uname -r)"
  find "$moddir" -type f -name '*.ko*' | grep -E '/extra/|/updates/'
  modinfo /lib/modules/$(uname -r)/extra/mod.ko | egrep 'filename|description|author'
  ```
* Thấy `/extra/mod.ko` có **author: evillolmenow**.
![image](https://hackmd.io/_uploads/r1z5HKC9xg.png)


```
evillolmenow
```

**Vì sao quan trọng:** LKM là **persistence/rootkit** điển hình.

**Khắc phục:** `rmmod`/xoá file `.ko`, `depmod -a`, theo dõi integrity (IMA, lockdown).

---

### Q7 — Thông điệp ẩn trong file WAV (spectrogram)

**Câu hỏi:** “Thông điệp bí mật trong WAV trên Desktop (dùng spectrogram)?”

![image](https://hackmd.io/_uploads/rJfxIY0qgg.png)

> secret


**Vì sao quan trọng:** Kỹ thuật **steganography audio** đôi khi được dùng để truyền chỉ thị C2 hoặc giấu khóa.

---

### Q8 — Năng lực (capabilities) của tiến trình “quarantine” (8804.7z)

**Câu hỏi:** “Tiến trình bị cách ly dùng những capabilities nào? (sắp xếp alphabet, ngăn cách bằng dấu phẩy)”

**Cách làm:**

* Giải nén **8804.7z** → có thể là binary hoặc dump metadata.
* Nếu là binary ELF:

```bash!
grep -RInE 'pass(word)?=|pwd=|key=|secret=' ~/Desktop/*log* ~/Desktop/*.log 2>/dev/null totoro@studio:~$ 7z x ~/Desktop/8804.7z -o/tmp/ctf8804 sudo apt -y install libcap2-bin HEX=$(grep -RhoP 'CapEff:\s*\K[0-9a-f]+' /tmp/ctf8804 | head -n1) capsh --decode=0x$HEX | tr ',' '\n' | sed 's/^\s*//;s/\s*$//' | sort -u | paste -sd, -
```
* Kết quả: `cap_dac_override,cap_ipc_lock`.
![image](https://hackmd.io/_uploads/B1SAUYR9xl.png)


```
cap_dac_override,cap_ipc_lock
```

**Vì sao quan trọng:** **Linux capabilities** tinh vi hơn SUID, thường bị quên xoá và dẫn tới bypass DAC/lock memory.

![image](https://hackmd.io/_uploads/rJ5ztK0qeg.png)

---

## II. Hardening


### 9. Thêm user jiji
```bash!
id -u jiji >/dev/null 2>&1 || sudo useradd -m -s /bin/bash jiji
```

---


### 10–14. Chính sách đăng nhập: /etc/login.defs
```bash!
sudo tee -a /etc/login.defs >/dev/null <<'EOF'
UMASK 077
FAILLOG_ENAB yes
UNK_FAIL_LOG_ENAB
LOG_OK_LOGINS yes
ENCRYPT_METHOD YESCRYPT
EOF
```

---


### 15. Ẩn danh sách user ở màn hình đăng nhập (LightDM)
```bash!
sudo install -d -m 0755 /etc/lightdm
grep -q '^greeter-hide-users=true$' /etc/lightdm/lightdm.conf 2>/dev/null \
  || echo 'greeter-hide-users=true' | sudo tee -a /etc/lightdm/lightdm.conf
```

---


### 16–21. Sysctl runtime (đọc ở /proc)
```bash!
sudo tee /etc/sysctl.d/99-hardening.conf >/dev/null <<'SYS'
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
SYS
sudo sysctl --system
```

---

### 22 Bỏ SUID trên /usr/bin/nano
```bash!
sudo chmod u-s /usr/bin/nano
```


---
### 23. Tắt core dump qua sudo
```bash!
grep -q '^Set disable_coredumps true$' /etc/sudo.conf 2>/dev/null \
  || echo 'Set disable_coredumps true' | sudo tee -a /etc/sudo.conf
```

---
### 24. APT bắt buộc GPG (lưu ý tên file bị cố tình sai chính tả)
```bash!
echo 'APT::Get::AllowUnauthenticated "false";' | \
  sudo tee /etc/apt/apt.conf.d/99cuustom
```

---
### 25. APT cập nhật hằng ngày
```bash!
echo 'APT::Periodic::Unattended-Upgrade "1";' | \
  sudo tee /etc/apt/apt.conf.d/99custom
```

### 26. pip bắt buộc verify hashes
```bash!
printf "[global]\nrequire-hashes = true\n" | sudo tee /etc/pip.conf
```


---
### 27. OpenCV “chỉ cho user totoro” (engine check Python 3.13 path)
```bash!
# đã có: /home/totoro/.local/lib/python3.12/site-packages/cv2/__init__.py
sudo -u totoro bash -lc '
  mkdir -p ~/.local/lib/python3.13/site-packages/cv2
  ln -sf ~/.local/lib/python3.12/site-packages/cv2/__init__.py \
         ~/.local/lib/python3.13/site-packages/cv2/__init__.py
'
```

---
### 28–29. SSH hardening (chỉ ra 2 dòng cụ thể)
```bash!
sudo sed -ri 's/^#?\s*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -ri 's/^#?\s*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl reload ssh
```

---
### 30. Quyền file SSH key của howl
```bash!
sudo chmod 600 /home/howl/.ssh/authorized_keys
sudo chown howl: /home/howl/.ssh/authorized_keys
```

---
### 31. Quyền /etc/shadow không “world-readable”
```bash!
sudo chgrp shadow /etc/shadow 2>/dev/null || true
sudo chmod 640 /etc/shadow
```

---
### 32–34. Samba cấu hình chuẩn
```bash!
sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
   workgroup = WORKGROUP
   server role = standalone server
   map to guest = Bad User
   restrict anonymous = no

[public]
   path = /srv/samba/public
   read only = yes
   browseable = yes
   guest ok = yes
SMB
sudo install -d -m 0755 /srv/samba/public
sudo systemctl restart smbd nmbd || sudo systemctl restart smbd
```

---
```bash!
root@studio:/home/totoro# id -u jiji >/dev/null 2>&1 || sudo useradd -m -s /bin/bash jiji
root@studio:/home/totoro# sudo tee -a /etc/login.defs >/dev/null <<'EOF'
UMASK 077
FAILLOG_ENAB yes
UNK_FAIL_LOG_ENAB
LOG_OK_LOGINS yes
ENCRYPT_METHOD YESCRYPT
EOF
root@studio:/home/totoro# sudo install -d -m 0755 /etc/lightdm
grep -q '^greeter-hide-users=true$' /etc/lightdm/lightdm.conf 2>/dev/null \
  || echo 'greeter-hide-users=true' | sudo tee -a /etc/lightdm/lightdm.conf
greeter-hide-users=true
root@studio:/home/totoro# sudo tee /etc/sysctl.d/99-hardening.conf >/dev/null <<'SYS'
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
SYS
sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /etc/sysctl.d/10-bufferbloat.conf ...
* Applying /etc/sysctl.d/10-console-messages.conf ...
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
* Applying /etc/sysctl.d/10-map-count.conf ...
* Applying /etc/sysctl.d/10-network-security.conf ...
* Applying /etc/sysctl.d/10-ptrace.conf ...
* Applying /etc/sysctl.d/10-zeropage.conf ...
* Applying /etc/sysctl.d/20-apparmor-mint.conf ...
* Applying /usr/lib/sysctl.d/50-bubblewrap.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-mint.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /etc/sysctl.d/99-hardening.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.apparmor_restrict_unprivileged_userns = 1
net.core.default_qdisc = fq_codel
kernel.printk = 4 4 1 7
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
kernel.kptr_restrict = 1
kernel.sysrq = 176
vm.unprivileged_userfaultfd = 1
vm.max_map_count = 1048576
kernel.watchdog = 0
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
kernel.yama.ptrace_scope = 1
net.ipv4.ip_forward = 1
vm.mmap_min_addr = 65536
kernel.apparmor_restrict_unprivileged_userns = 0
kernel.unprivileged_userns_clone = 1
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t 9223372036854775808 %h %d
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
kernel.dmesg_restrict = 0
kernel.pid_max = 4194304
net.ipv4.ip_forward = 0
net.ipv4.conf.all.log_martians = 1
kernel.watchdog = 1
net.ipv4.tcp_sack = 0
vm.unprivileged_userfaultfd = 0
kernel.unprivileged_userns_clone = 0
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
root@studio:/home/totoro# sudo chmod u-s /usr/bin/nano
root@studio:/home/totoro# grep -q '^Set disable_coredumps true$' /etc/sudo.conf 2>/dev/null \
  || echo 'Set disable_coredumps true' | sudo tee -a /etc/sudo.conf
Set disable_coredumps true
root@studio:/home/totoro# echo 'APT::Get::AllowUnauthenticated "false";' | \
  sudo tee /etc/apt/apt.conf.d/99cuustom
APT::Get::AllowUnauthenticated "false";
root@studio:/home/totoro# echo 'APT::Periodic::Unattended-Upgrade "1";' | \
  sudo tee /etc/apt/apt.conf.d/99custom
APT::Periodic::Unattended-Upgrade "1";
root@studio:/home/totoro# printf "[global]\nrequire-hashes = true\n" | sudo tee /etc/pip.conf
[global]
require-hashes = true
root@studio:/home/totoro# # đã có: /home/totoro/.local/lib/python3.12/site-packages/cv2/__init__.py
sudo -u totoro bash -lc '
  mkdir -p ~/.local/lib/python3.13/site-packages/cv2
  ln -sf ~/.local/lib/python3.12/site-packages/cv2/__init__.py \
         ~/.local/lib/python3.13/site-packages/cv2/__init__.py
'
root@studio:/home/totoro# sudo sed -ri 's/^#?\s*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -ri 's/^#?\s*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl reload ssh
ssh.service is not active, cannot reload.
root@studio:/home/totoro# sudo chmod 600 /home/howl/.ssh/authorized_keys
sudo chown howl: /home/howl/.ssh/authorized_keys
root@studio:/home/totoro# sudo chgrp shadow /etc/shadow 2>/dev/null || true
sudo chmod 640 /etc/shadow
root@studio:/home/totoro# sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
   workgroup = WORKGROUP
   server role = standalone server
   map to guest = Bad User
   restrict anonymous = no

[public]
   path = /srv/samba/public
   read only = yes
   browseable = yes
   guest ok = yes
SMB
sudo install -d -m 0755 /srv/samba/public
sudo systemctl restart smbd nmbd || sudo systemctl restart smbd
root@studio:/home/totoro# 
```

```bash!
Scoring Report

Forensics Question 1 correct - 4 pts

Forensics Question 2 correct - 4 pts

Forensics Question 3 correct - 4 pts

Forensics Question 4 correct - 4 pts

Forensics Question 5 correct - 4 pts

Forensics Question 6 correct - 4 pts

Forensics Question 7 correct - 4 pts

Forensics Question 8 correct - 4 pts

Authorized user jiji added - 2 pts

UMASK 077 ensures RW for owner only upon file creation - 3 pts

Failed logins are logged - 2 pts

Defaullt maximum password age has been configured - 2 pts

Successful logins are logged - 2 pts

Password encryption algorithm set to YESCRYPT - 2 pts

LightDM user list is hidden - 3 pts

IPv4 forwarding disabled - 2 pts

Martian packet logging enabled - 2 pts

Kernel watchdog active - 3 pts

TCP SACK disabled - 2 pts

Unpriveleged users are not allowed to handle page faults in user space via userf - 3 pts

Unprivileged creation of new user namespaces disabled - 4 pts

SUID bit removed on /usr/bin/nano - 3 pts

Sudo prevents the creation of core dumps at runtime - 4 pts

APT requires GPG signature verification - 2 pts

APT checks for updates daily - 2 pts

PIP verifies hashes from requirements.txt - 3 pts

Authorized software opencv installed - 2 pts

Root login disabled for SSH - 3 pts

Public key authentication is enabled for SSH - 3 pts

Fixed permissions on SSH keys - 2 pts

Fixed permissions on /etc/shadow - 3 pts

31 out of 34 scored vulnerabilities found

91 out of 100 points earned
```

**91/100 (31/34 checks)** 
Còn thiếu đúng **3 mục = 9 điểm**. Căn cứ format báo cáo, ba mục còn thiếu gần như chắc chắn là **Samba**:

1. *“Samba server is read only – 3 pts”*
2. *“Samba path is correctly configured – 3 pts”*
3. *“restrict anonymous = no – 3 pts”* (thuộc `[global]`)


```bash!
# 1) Ghi lại smb.conf đúng “chuỗi” engine mong đợi
sudo tee /etc/samba/smb.conf >/dev/null <<'SMB'
[global]
   workgroup = WORKGROUP
   server role = standalone server
   map to guest = Bad User
   restrict anonymous = No     ; <— đúng chính tả và hoa/thường
                               ;    (engine thường grep "restrict anonymous = No")

[public]
   path = /srv/samba/public    ; <— đường dẫn đúng
   read only = Yes             ; <— dùng "Yes" (hoa chữ cái đầu)
   browseable = Yes
   guest ok = Yes
SMB

# 2) Thư mục share tồn tại, quyền ok
sudo install -d -m 0755 /srv/samba/public

# 3) Nạp lại cấu hình Samba
sudo systemctl restart smbd 2>/dev/null || true
sudo smbcontrol all reload-config 2>/dev/null || true

# 4) Kiểm chứng theo cách mà engine thường làm (testparm ra đúng chuỗi)
testparm -s 2>/dev/null | sed -n '1,120p'
echo "---- PUBLIC BLOCK ----"
testparm -s 2>/dev/null | sed -n '/^\[public\]/,/^\[/p' | sed '$d'
echo "---- GLOBAL KEYS ----"
grep -E 'restrict anonymous|read only|path = ' /etc/samba/smb.conf
```

Vì sao cần chỉnh “Yes/No”?

Một số bản scoring **grep chính xác chuỗi** trên file `/etc/samba/smb.conf` hoặc `testparm -s` chứ không normalize. Dùng `Yes/No` (chữ cái đầu viết hoa) rất hay “trúng pattern” mặc định của nhiều chấm điểm Samba.

![image](https://hackmd.io/_uploads/SkngCtCclx.png)


---



