无垠之码

深度剖析代码之道


libcurl-指北针

libcurl是一个易用免费的http客户端库,其支持众多应用层传输协议,如DICT(dict://dict.org/d:computer,RFC2229定义的基于TCP的字典查询协议)、FILE、FTP, FTPS、GOPHER(诞生于1980年代末期的早期互联网协议,用于浏览和检索文本文档,已淘汰)、GOPHERS、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP、WS和WSS等协议。并且在功能特性上libcurl支持SSL证书,以及POST|PUT|FTP等上传,各种代理隧道模式,身份认证方式,文件传输中断恢复等。libcurl支持各种操作系统平台,如常见的Linux,Windows,FreeBSD, OpenBSD,甚至不常见的UnixWare, HURD, Windows, Amiga, OS/2等

接口类型


easy接口

libcurl提供简单高效同步的easy接口簇供开发者快速上手,目前大量开源软件依赖这些接口。按照libcurl的官方文档,该使用模式只需要调用curl_easy_init获取curl句柄(后续调用easy函数簇入参),再设置相关的curl句柄的options(其中必须设置CURLOPT_URL,该参数决定后续模式和对象),最后调用curl_easy_perform执行操作,如果没有后续操作,或者并不需要长连接,记得调用curl_easy_cleanup销毁句柄。


typedef CURL* (*curl_easy_init_func)();
typedef CURLcode (*curl_easy_setopt_func)(CURL*, CURLoption, ...);
typedef CURLcode (*curl_easy_perform_func)(CURL*);
typedef void (*curl_easy_cleanup_func)(CURL*);
typedef const char* (*curl_easy_strerror_func)(CURLcode errornum);
typedef struct curl_slist* (*curl_slist_append_func)(struct curl_slist* list, const char* string);
typedef void (*curl_slist_free_all_func)(struct curl_slist* list);

typedef struct {
  curl_easy_init_func init;
  curl_easy_setopt_func setopt;
  curl_easy_perform_func perform;
  curl_easy_cleanup_func cleanup;
  curl_easy_strerror_func strerror;
  curl_slist_append_func slist_append;
  curl_slist_free_all_func slist_free_all;
} CurlInterface;

int onvif_auth_lack_verify(CurlInterface *ci, int argc, const char **argv) {
  int res = -1;
  CURL *curl = NULL;

  if (argc < 1) {
    log_error("onvif_auth_lack poc verify require url");
    goto done;
  }

  const char *url = argv[0];
  onvif_auth_resp_body_t chunk = {0};

  curl = ci->init();
  if (!curl) {
    log_error("onvif_auth_lack failed to initialize curl");
    goto done;
  }

  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_URL, url) == CURLE_OK), done, "set url fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_TIMEOUT, 5L)) == CURLE_OK, done, "set timeout failed");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEFUNCTION, onvif_resp_callback) == CURLE_OK), done, "set write func fail");
  CHECK_F2_LABEL((ci->setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk)) == CURLE_OK, done, "set write data fail");

  CURLcode curl_res = ci->perform(curl);
  if (curl_res != CURLE_OK) {
    log_error("CURL error: %s", ci->strerror(curl_res));
    goto done;
  }

  if (memcmp(chunk.data + 2048 - 10, ONVIF_AUTH_LACK_MAGIC_STRING, 10) == 0) {
    log_trace("Vulnerability found at URL: %s", url);
  }

  res = 0;  // success
done:
  if (curl) ci->cleanup(curl);
  return res;
}

multi接口

The multi interface is the asynchronous brother in the family and it also offers multiple transfers using a single thread and more. Get a grip of how to work with it in the multi interface overview.

Read more...

出埃及记

埃及新王压迫以色列人


:1 以色列的众子,各带家眷和雅各一同来到埃及。他们的名字记在下面:
1:2 有流便、西缅、利未、犹大、
1:3 以萨迦、西布伦、便雅悯、
1:4 但、拿弗他利、迦得、亚设。
1:5 凡从雅各而生的,共有七十人;约瑟已经在埃及。
1:6 约瑟和他的弟兄,并那一代的人都死了。
1:7 以色列人生养众多,并且繁茂,极其强盛,满了那地。
1:8 有不认识约瑟的新王起来,治理埃及。
1:9 对他的百姓说:“看哪,这以色列民比我们还多,又比我们强盛。
1:10 来吧!我们不如用巧计待他们,恐怕他们多起来,日后若遇什么争战的事,就连合我们的仇敌攻击我们,离开这地去了。”
1:11 于是埃及人派督工的辖制他们,加重担苦害他们。他们为法老建造两座积货城,就是比东和兰塞。
1:12 只是越发苦害他们,他们越发多起来,越发蔓延,埃及人就因以色列人愁烦。
1:13 埃及人严严地使以色列人做工,
1:14 使他们因做苦工觉得命苦;无论是和泥,是做砖,是做田间各样的工,在一切的工上都严严地待他们。
1:15 有希伯来的两个收生婆,一名施弗拉,一名普阿。埃及王对她们说:
1:16 “你们为希伯来妇人收生,看她们临盆的时候,若是男孩,就把他杀了;若是女孩,就留她存活。”
1:17 但是收生婆敬畏 神,不照埃及王的吩咐行,竟存留男孩的性命。
1:18 埃及王召了收生婆来说:“你们为什么做这事,存留男孩的性命呢?”
1:19 收生婆对法老说:“因为希伯来妇人与埃及妇人不同,希伯来妇人本是健壮的(注:原文作"活泼的”),收生婆还没有到,她们已经生产了。"
1:20 神厚待收生婆。以色列人多起来,极其强盛。
1:21 收生婆因为敬畏 神, 神便叫她们成立家室。
1:22 法老吩咐他的众民说:“以色列人所生的男孩,你们都要丢在河里;一切的女孩,你们要存留她的性命。

qemu网络配置

0.Qemu虚拟机网络


Qemu虚拟机网络包含两部分:

  • 网络前端,提供给虚拟机的虚拟网卡部分
  • 网络后端,与虚拟网卡交互部分,实现数据包与宿主机通信
  1. the virtual network device that is provided to the guest, a PCI network card
  2. interacts with the emulated NIC, puts packets onto the host’s network

默认情况下,qemu将创建一个SLiRP网络后端,同时为虚拟机创建合适的网络前端。例如针对大多数x86虚拟机,qemu将创建e1000-pci网络前端。取消默认的网络配置,可以使用-nic none(使用-nodefaults也可以取消默认网络配置,但会影响其他设备的默认选项)。

注意,使用默认的SLiRP网络后端,ICMP协议不被支持,TCP/UDP没有影响。在SLiRP下不能使用ping测试网络联通性

通过命令行的指定的任何网络参数,Qemu要求同时提供足够的信息定义网络前端和后端。忘记指定网络前端或后端,Qemu在运行过程中会提示警告信息。例如,“Warning:netdev net0 has no peer”, “Warning: hub 0 is not connected to host network” “Warning: hub 0 with no nics” Qemu虚拟机将正常启动,但不能提供正常网络服务

1.Qemu虚拟机网卡


Qemu虚拟机支持板载和可插拔两种类型的网卡。

  • 板载网卡,板载网卡一般指主板自带的网络适配器(Onboard NIC basically means a Network interfaces controller built into the motherboard of a PC or a laptop, etc. You don’t have to insert or purchase it separately)。

    Read more...

绘图工具

PlantUML和Mermaid类似都是基于文本的绘图工具,但基于Java运行环境的PlantUML更专注于软件工程图表且需要本地安装或服务器渲染,而基于Javascript运行环境的Mermaid支持更广泛的图表类型(包括甘特图、饼图等非UML图表),并且可以直接在现代浏览器中运行(需要引用mermaid-js渲染)。

其实图表的绘制语法,官方网站都有详尽介绍,本文对两者的使用方法及部分关键功能进行概述和实践示例,不做语法细节的全面展开。

1.PlantUML


标准库

在使用PlantUML绘制图标之前需要了解其提供的标准库,使用stdlib或者%get_all_stdlib命令可以展示当前版本PlantUML支持的标准库及其对应的源码项目。这里的标准库指PlantUML内置图元和功能模块的集合。具体标准使用请直接跳转至官方文档,https://plantuml.com/zh/stdlib。

  • Archimate

    Archimate是一种开放且独立的企业体系结构建模语言,它支持在业务领域内部和跨业务领域的架构描述,分析和可视化。结构化表示企业的各个组成部分,它们的相互关系及其与IT基础架构的集成关系。下图显示了ArchiMate Core框架的元素。

    image

  • Awslib|Aws

    AWS库提供了用于绘制Amazon Web Services服务和资源的图元(sprites)、宏(macros)以及其他包含文件(includes)。所有元素均基于官方的AWS架构图标生成,并结合PlantUML和C4模型,是以代码形式表达设计、部署和拓扑结构的极佳方式。Aws库功能一致,后续可能不再会支持(Warning: We are thinking about deprecating this library.)

  • Azure

    Azure库囊括一系列关于微软云相关的图标,在使用过程中可以首先包含!include <azure/AzureCommon>其提供helper宏方便使用。

  • C4

    C4模型是一个用于描述软件系统架构的可视化建模方法,由架构师Simon Brown提出在2018年发布。模型从以下四个维度,描述复杂系统全貌及系统组建之间的关系。

    1. Context系統上下文,说明系统和其使用者以及其他系統的关系
    2. Container容器,将系统分解为相关联的容器,描述一个软件系统内部的高层结构,容器是可部署/可运行的应用或服务单元
    3. Component组件,进一步细化容器内部结构,展示容器是由哪些组件组成,以及它们之间的关系。组件是构成容器的逻辑单元,通常表示容器内部的业务功能模块、服务类、控制器、DAO等
    4. Code代码,提供架构元素的涉及的细节,使用UML或者ER等既有的语法表达代码细节。
  • Classy|Classy-C4

    Classy是一个PlantUML扩展库,旨在提供更优雅、更现代化的类图绘制方式。核心目标是简化PlantUML的语法,同时增强类图的可读性和美观性。

  • Logos

    Logos是PlantUML中内置的技术品牌与开源项目Logo图标集合,格式为SVG。该图标库特别适用于开发者、DevOps 工程师等在架构图、技术栈展示中插入各类知名品牌标志(如GitHub、MySQL、Redis、Kubernetes等)。

  • Tupadr3

    Tupadr3图标库汇集了大量开发相关技术图标,包括Node.js、Docker、VS Code等。同时也集成了Devicons、Font Awesome等流行图标集中的品牌与UI元素,适用于README、技术简报与系统设计图中图标的插入。

  • Elastic|Material|Office|Kubernetes

    这些图标库包含了在开发、设计与文档中广泛使用、大家熟悉的图标与品牌标志。Elastic:Elastic Stack相关图标(如 Elasticsearch、Kibana);Material Icons:Google的Material Design图标,适用于UI设计;Office:Microsoft Office产品图标,适用于办公系统、文档管理相关系统;Kubernetes:容器编排相关图标,如Pod、Cluster、Deployment等,适用于云原生架构图;

  • Osa

    Open Security Architecture(OSA)是一个开源项目,旨在为企业架构师、系统设计师、安全专家等提供免费、可重复使用的安全架构模式Security Architecture Patterns和参考模型。 PlantUML官方标准库(stdlib)中为OSA图形符号提供的图元库,这意味着开发者可以使用OSA风格的图标(如防火墙、身份提供者、加密模块、终端等),快速构建符合OSA风格的安全架构图

  • Domainstory

    领域故事讲述(Domain Storytelling)是一种协作建模技术,它通过"讲故事"的方式来理解和记录业务领域的运作方式。这种方法特别适合在软件开发初期帮助开发人员理解业务需求。 PlantUML扩展工具包,包含用于可视化领域故事的宏(macros)、主题(themes)以及其他辅助工具,能够帮助你用PlantUML直观地记录和表达领域故事内容。

  • Cloudogu|Cloudinsight

    Cloudogu Ecosystem是一个开源、模块化、企业级DevOps平台,适合需要私有部署、工具整合和高安全性的开发团队。Cloudinsight是一个主要面向运维AIOps和IT监控分析的SaaS平台,专注于预测性运维和故障预防。PlantUML可以方便引用相关图标。

主题

PlantUML支持30多种主题,开发者可以简单使用!theme spacelab引用预置主题,使用函数%get_all_theme打印当前PlantUML版本支持的主题。

@startuml
!theme spacelab
start
:init;
-> test of color;
if (color?) is (<color:red>red) then
  :print red;
else 
  :print not red;
  note right: no color
endif
partition End {
  :end;
}
-> this is the end;
end
@enduml

预处理

一些预处理功能包含在PlantUML中,并可用于所有类型的绘图。这些功能与C语言的预处理器非常相似,只是特殊字符#改为感叹号!

Read more...

cloud-init入门

cloud-init最早由Canonical公司开发,初衷是解决云计算环境中ubuntu实例的自动化配置问题。随着云计算的普及,cloud-init的功能不断扩展,逐步加入实例启动时自动执行一系列配置任务,例如设置主机名、配置网络、安装软件包等,并且支持更多的配置操作和更多的Linux发行版,诸如Fedora、Debian、CentOS等,也开始集成cloud-init作为其云镜像的一部分,成为云平台中实例初始化的事实标准。

在cloud-init未出现之前,也有一些工具和方法用于自动化配置和管理服务器和虚拟机实例,比如

  • Kickstart是Red Hat系列发行版(如RHEL和CentOS)用于自动化安装系统的工具
  • Preseed是Debian和基于Debian的发行版(如Ubuntu,Mint)用于自动化安装的工具
  • AutoYast是SUSE Linux Enterprise和OpenSUSE的自动化安装工具
  • Ignition用于CoreOS和Flatcar Linux的初始配置工具

更强大的PXE Boot预启动执行环境(PXE)允许计算机通过网络启动,并从网络服务器下载操作系统和配置文件。其通常与Kickstart或Preseed配合使用,实现自动化安装和配置。

但是这些工具大多用于操作系统安装阶段的自动化,适用于数据中心或物理机/虚拟机部署场景,设计初衷并非针对云环境,即并非云原生。而cloud-init则是为云平台而生的,强调实例生命周期的初始化配置,并支持与云平台元数据服务(如EC2 meta-data)集成,实现更动态的配置流程。

值得一提的是,虽然cloud-init起初是为云环境设计的,但由于其通用性和灵活性,它也逐渐被用于传统虚拟机和服务器的自动化初始化任务中,不再局限于“云原生”场景。

0.初识cloud-init


在整个系统启动的过程中,cloud-init的执行包括Generator、Local、Network、Config、Final,5个阶段。cloud-init支持很多模块真正的定制工作就是由这些模块完成,在cloud-init中cloud.cfg配置决定具体的模块可以在不包括Generator的4个阶段中的哪一个阶段运行,user-data包含定制化模块的具体参数,datasource告诉cloud-init从何处读取到user-data内容,源码内部cloud-init定义了统一的抽象类接口,所有的datasource实现都要按照规范实现这些接口。

image

以下是阿里云主机导出的cloud.cfg配置文件样例,其定义整个cloud-init过程各个阶段需要执行的相关动作及配置

# The top level settings are used as module
# and system configuration.

# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
   - default

user:
    name: root
    lock_passwd: False

# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the default $user
disable_root: false

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false

manage_etc_hosts: localhost


apt:
    preserve_sources_list: true


datasource_list: [ AliYun ]

# Example datasource config
datasource:
    AliYun:
        support_xen: false
        timeout: 5
        max_wait: 300
#      metadata_urls: [ 'blah.com' ]

# The modules that run in the 'init' stage
cloud_init_modules:
 - migrator
 - source-address
 - pip-source
 - seed_random
 - bootcmd
 - write-files
 - [ growpart, once-per-instance ]
 - [ resizefs, once-per-instance ]
 - disk_setup
 - mounts
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - ca-certs
 - rsyslog
 - users-groups
 - ssh

# The modules that run in the 'config' stage
cloud_config_modules:
# Emit the cloud config ready event
# this can be used by upstart jobs for 'start on cloud-config'.
 - emit_upstart
 - snap
 - snap_config  # DEPRECATED- Drop in version 18.2
 - ssh-import-id
 - locale
 - set-passwords
 - grub-dpkg
 - apt-pipelining
 - apt-configure
 - ubuntu-advantage
 - ntp
 - timezone
 - disable-ec2-metadata
 - runcmd
# - ntp-conf
# - chrony-conf
 - byobu

# The modules that run in the 'final' stage
cloud_final_modules:
 - snappy  # DEPRECATED- Drop in version 18.2
 - package-update-upgrade-install
 - fan
 - landscape
 - lxd
 - ubuntu-drivers
 - puppet
 - chef
 - mcollective
 - salt-minion
 - rightscale_userdata
 - scripts-vendor
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

# System and/or distro specific settings
# (not accessible to handlers/transforms)
system_info:
   # This will affect which distro class gets used
   distro: ubuntu
   paths:
      cloud_dir: /var/lib/cloud/
      templates_dir: /etc/cloud/templates/
      upstart_dir: /etc/init/
   ssh_svcname: ssh

image

Read more...

openstack使用笔记

1.常用命令


  • 镜像相关

镜像服务(Glance)使用户能够发现、注册和获取虚拟机镜像。它提供了一个REST API,允许用户查询虚拟机镜像的元数据并获取实际的镜像文件。通过镜像服务,虚拟机镜像可以存储在多种位置,包括简单的文件系统或类似于OpenStack对象存储这样的对象存储系统中。Glance默认使用使用文件后端,将镜像存储与控制节点的/var/lib/glance/images/目录。

openstack image子命令提供操作镜像相关操作

openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| b75daf8c-308c-4724-a2ac-8645580e0145 | apline | active |
| d6517dc4-7b19-4cb5-8f77-7051a064b69b | arch   | active |
| 28677059-0367-48ec-8cd6-fb4c532c49a1 | centos | active |
+--------------------------------------+--------+--------+

openstack image show d6517dc4-7b19-4cb5-8f77-7051a064b69b -f json
{
  "checksum": "ab3aeb65083b702089dfad4ce0ed8f55",
  "container_format": "bare",
  "created_at": "2025-05-10T10:10:51Z",
  "disk_format": "qcow2",
  "file": "/v2/images/d6517dc4-7b19-4cb5-8f77-7051a064b69b/file",
  "id": "d6517dc4-7b19-4cb5-8f77-7051a064b69b",
  "min_disk": 0,
  "min_ram": 0,
  "name": "arch",
  "owner": "8477b13786304b8db735a47f0b958ae1",
  "properties": {
    "os_hidden": false,
    "os_hash_algo": "sha512",
    "os_hash_value": "784478b376b65cad399a7e6ccc081cda316ddbc48c26e6d5956e3a5d2592122d739e0d09e76a702489717f8fcc6a3f3b0ca3fe4a7c9b5eeba397990589733baa",
    "hw_qemu_guest_agent": "yes"
  },
  "protected": false,
  "schema": "/v2/schemas/image",
  "size": 541063168,
  "status": "active",
  "tags": [],
  "updated_at": "2025-05-10T10:12:15Z",
  "virtual_size": 2147483648,
  "visibility": "shared"
}

openstack image set --property hw_qemu_guest_agent=yes 28677059-0367-48ec-8cd6-fb4c532c49a1
  • 实例模板

openstack flavor(定义实例创建所分配的资源)子命令提供云实例模板的相关操作

Read more...

frida零基础入门

It’s Greasemonkey for native apps, or, put in more technical terms, it’s a dynamic code instrumentation toolkit. It lets you inject snippets of JavaScript or your own library into native apps on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX. Frida also provides you with some simple tools built on top of the Frida API. These can be used as-is, tweaked to your needs, or serve as examples of how to use the API.

Read more...

cowrie蜜罐

蜜罐(Honeypot)是指一种故意暴露的系统、服务或数据,用来引诱攻击者进行入侵、探测或攻击,然后监控、记录他们行为的信息化系统。其主要目的是迷惑攻击者,监控攻击行为,收集威胁情报。本文介绍的cowrie是一种模拟SSH服务器,诱捕爆破和远程登录攻击行为的中交互蜜罐。

cowrie作为一种交互式蜜罐具有以下优点:

  • 可以输出丰富的日志格式:如文本、JSON格式,方便后续处理
  • 能够直接接入SIEM系统(比如 Splunk、ELK Stack)、安全告警系统,实现实时监控
  • 轻松介入misp开源威胁情报平台
  • 虚拟文件系统,伪装度高,不容易被识破,攻击者虽然可以登录和操作,但其实运行在受控的模拟环境里,不能真正破坏宿主机
  • 记录登录行为,命令执行,收集恶意样本
  • 社区活跃,持续修复Bug、更新新功能,定制化程度高

1. 部署蜜罐


cowrie的安装官网已介绍的是否详细,这里不再赘述,为使得模拟环境更加真实,下面使用qemu虚拟机+官方的docker镜像快速搭建蜜罐环境

sudo apt-get install u-boot-qemu opensbi qemu-system qemu guestfs-tools
wget https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2
mv generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2 alpine.qcow2
qemu-img resize ./alpine.qcow2 +10G
sudo virt-customize -a alpine.qcow2 --root-password password:123456

# 由于虚拟机内存实在太小,只能分配给qemu实例256M内存
qemu-system-x86_64 \
  --nographic \
  -m 256M \
  -smp 1 \
  -net nic -net user,hostfwd=tcp::9090-:22 \
  -drive file=alpine.qcow2,format=qcow2 

# 增加用户
useradd -m peter

# ubuntu云主机镜像需要执行下列操作实际扩容
growpart /dev/sda 1
resize2fs /dev/sda1

下面运行cowrie实例,配置关闭其关闭telnet,简单的将流量转发至后端主机9090端口,此刻攻击者通过连接8822端口,即可访问qemu虚拟机

docker run --name=cowrie \
	--user=cowrie \
	--env COWRIE_TELNET_ENABLES=no \
	--env COWRIE_SSH_LISTEN_ENDPOINTS=tcp:8822:interface=0.0.0.0 \
	--env COWRIE_HONEYPOT_BACKEND=proxy \
	--env COWRIE_PROXY_BACKEND=simple \
	--env COWRIE_PROXY_BACKEND_SSH_HOST=103.79.76.198 \
	--env COWRIE_PROXY_BACKEND_SSH_PORT=9090 \
	--env COWRIE_PROXY_BACKEND_USER=peter \
	--env COWRIE_PROXY_BACKEND_PASS=topsec \
	--volume /cowrie/cowrie-git/etc \
	--volume /cowrie/cowrie-git/var \
	--cap-drop=ALL \
	--workdir=/cowrie/cowrie-git \
	-p 8822:8822 \
	--detach=true \
	cowrie/cowrie:114c918e 

可以看到攻击者117.151.88.32使用root/1234账户登录主机,执行date命令后退出,整个会话持续96秒

Read more...
1 of 4 Next Page