1.信息安全课程8:套接字(socket) 编程
2.CSerialPort教程4.3.x (2) - CSerialPort源码简介
3.请详ç»ä»ç»ä¸ä¸vc
4.JBoss反序列化漏洞(CVE-2017-12149)
信息安全课程8:套接字(socket) 编程
本文的源码socket介绍仅服务于课程目的,点到即止。源码如果希望继续深入学习socket,源码可以参照《Unix网络编程》等书籍以及参考文献。源码
套接字(socket)允许在相同或不同的源码机器上的两个不同进程之间进行通信。更准确地说,源码android 闹钟 源码它是源码使用标准Unix文件描述符与其他计算机通信的一种方式。在Unix中,源码每个I/O操作都是源码通过写入或读取文件描述符来完成的。文件描述符只是源码与打开文件关联的整数,它可以是源码网络连接、文本文件、源码终端或其他内容。源码
对于程序员来说,源码套接字的源码使用和行为很像更底层的文件描述符。这是因为对于套接字,read()和write()等命令可以像在文件和管道编程中同样的使用。
套接字首先在BSD 2.1中引入,然后在BSD 4.2形成当前的稳定版本。现在,大多数最新的UNIX系统版本都提供了套接字功能。
Unix Socket用于客户端 - 服务器应用程序框架中。服务器是根据客户端请求执行某些功能的过程。大多数应用程序级协议(如FTP、SMTP和POP3)都使用套接字在客户端和服务器之间建立连接,然后交换数据。
用户可以使用四种类型的套接字。前两个是源码对接短信最常用的,后两个使用较少。一般假定进程仅在相同类型的套接字之间进行通信,但是也没有限制阻止不同类型的套接字之间的通信。
使用socket的时候需要使用各种结构来保存有关地址和端口的信息以及其他信息。 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。通常使用四元组来描述一个网络连接,使用socket的时候,往往也需要数据结构来描述这些信息。
这是一个通用的套接字地址结构,在大多数套接字函数调用中都需要使用它。 成员字段的说明如下。sa_family包括以下可选值。每个值代表一种地址族(address family),在基于IP的情况中,都使用AF_INET。
其中,sin_family和sockadd的sa_family一样,包括四个可选值:
sin_port是端口号,位长,网络字节序(network byte order);sin_addr是IP地址,位长,网络字节序(network byte order)。sin_zero,8个字节,设置为0。
至于为何会使用两个数据结构sockaddr和sockaddr_in来表示地址,原因是电脑cms源码如sa_family所指出的,socket设计之初本来就是准备支持多个地址协议的。不同的地址协议由自己不同的地址构造,譬如对于IPv4就是sockaddr_in, IPV6就是sockaddr_in6, 以及对于AF_UNIX就是sockaddr_un。sockaddr是对这些地址的上一层的抽象。另外,像sockaddr_in将地址拆分为port和IP,对编程也更友好。这样,在将所使用的的值赋值给sockaddr_in数据结构之后,通过强制类型转换,就可以转换为sockaddr。当然,从sockaddr也可以强制类型转换为sockaddr_in。
在sockaddr_in中还有一个结构体,struct in_addr,就是一个位的IP地址,同样是网络字节序。
为了允许具有不同字节顺序约定的机器相互通信,Internet协议为通过网络传输的数据指定了规范的字节顺序约定。 这称为网络字节顺序。在建立Internet套接字连接时,必须确保sockaddr_in结构的sin_port和sin_addr成员中的数据在网络字节顺序中表示。
不用担心这几个数据结构以及字节序,因为socket接口非常贴心地准备好了各种友好的接口。
譬如对上面描述的fastadmin插件源码过程,想要把地址...和端口绑定到一个socket,以下代码就足够了:
对于简单的socket应用编程,所需要做的就是记住流程。
使用客户端-服务器端(client-server)模型作为一个例子。server一般打开端口,被动侦听,不需要知道客户端的IP和端口;而client发起请求,必须知道服务器端的IP和端口。
在这个过程中,所需要用到的函数如下:
再用一张图描述下客户端和服务器端的流程:
接下来,我们看C/S的代码实例。
客户端代码:
以及服务器端代码:
编译之后,就可以在两个进程间进行通信了。这个简单代码的作用是服务端收到客户端发来的字符串并回显。
如果将上面代码中的while循环部分修改为:
那么实现的功能就是两个进程之间进行输入交流。
接下来思考问题:能不能利用上面的socket通信,获得一个shell?上面的例子中,当我们输入一个字符串,服务器给我们一个字符串,如果有了shell,发送过去一个命令,能够返回执行的结果。
实际上,只要对上面的代码做很少的修改,就可以实现获得shell的目的。
这里,我们稍微讨论一下,金课源码以上代码到底做了什么事情。
首先要习惯一个概念:在Linux中,一切皆文件。普通的文本文件确实是文件,但是设备、socket、管道等都被当成文件处理。所以我们获得的connfd也就是一个文件描述符。在Linux的文件描述符中有三个是特殊的,任何进程都一样的,0、1、2,分别代表标准输入,标准输出和标准出错。而它们都指向同一个tty(teleType,终端)。如果此时再去打开一个新的文件,它的文件描述符会是3。
为了进一步理解文件描述符,可以使用下面的代码:
能讲清楚上面代码的过程吗?下面的代码呢?
上面的代码中,把0分别换成1、2、3有什么结果?
下面代码的运行结果是什么呢?
另外,能否描述shell的工作过程?
可以再看下一个简单实现:
以及打开shell是怎么回事呢?当我们在命令行中输入bash(调用/bin/bash)的时候,就会在shell中打开一个新的shell。所以,当使用execlp调用/bin/bash的时候,就是打开了新的shell。
请记住,在这里我们有大量的内容没有介绍,譬如getservbyname、select、多线程、信号等。再次地,如果需要进一步学习,请参阅《unix网络编程》。
另外: 关于AF_INET和PF_INET
在一些文档中,可能会遇到"PF_INET"。 出现AF_INET和PF_INET是历史原因。在网络设计之初,AF = Address Family,PF = Protocol Family,所以最好在指示地址的时候使用AF,在指示协议的时候使用PF。因为那时人们希望同一个地址族( "AF" in "AF_INET" )可能支持多个协议族 ("PF" in "PF_INET" )。这样的话,就可以加以区分。
但是,并没有出现同一个地址族支持多个协议族的情况,现在在windows中,
所以在windows中AF_INET与PF_INET完全一样 。在Linux中,虽然 所以正确的做法是在struct sockaddr_in中使用AF_INET,以及在调用socket()时使用PF_INET。但实际上,可以在任何地方使用AF_INET。 而且,既然这就是W. Richard Stevens在他的书中所做的,那么我们这样做也毫无问题。
至于AF_PACKET 和 PF_PACKET,可以查看源代码:
可以发现:
也即,值是相同的。
利用nc实现正向shell和反向shell。正向shell:
受害者命令:nc -lvp -e /bin/sh;也即受害者在端口侦听,并且在这个端口上执行/bin/sh;
攻击者命令:nc ..1.2 ,也即攻击者去连端口,然后发送过去的数据在受害者主机执行,并将执行结果返回给攻击者;
反向shell的工作方式是远程计算机将自己的shell发送给特定的用户,而不是将shell绑定到一个端口上。之所以使用反向shell,主要是因为有时候防火墙可能会阻止正向的shell。反向shell:
攻击者侦听:nc -lvp ,攻击者打开了端口,等待连接;
被攻击者去连接攻击者,并且同时执行/bin/sh,连上攻击者之后,攻击者发送的命令可以在受害者主机执行,执行结果返回给攻击者。
在尝试nc -e选项的时候会出现
也即,nc有不同的版本,需要使用nc.traditional 才能使用-e选项。
可以使用 sudo apt-get install netcat命令,先安装nc.traditional 版本,然后使用update-alternatives来进行挑选。update-alternatives是Debian系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。
之后可以实现正向绑定和反向shell。
反向shell的代码,也即在client端打开shell:
参考:
CSerialPort教程4.3.x (2) - CSerialPort源码简介
CSerialPort教程4.3.x (2) - CSerialPort源码简介
本文档详细介绍了如何在MFC环境中使用CSerialPort库进行串口操作。CSerialPort是一个跨平台、轻量级的开源项目,支持多种编程语言,如C#, Java等,并遵循GNU Lesser General Public License v3.0协议。
首先,创建一个名为CommMFC的基于对话框的MFC项目,并从CSerialPort项目网站下载源码,包括SerialPort.cpp等关键文件。确保在项目属性中添加CSerialPort头文件目录,同时注意设置cpp文件的预编译头选项,以避免编译错误。
项目依赖于setupapi.lib库,需要在链接器设置中添加。在CommMFCDlg.h中,将CSerialPort类包含进来,使其子类化CSerialPortListener,并实现onReadEvent函数以及实例化CSerialPort对象。CCommMFCDlg的OnInitDialog和OnReceive函数将用于串口初始化、打开以及数据接收。
在实际操作中,例如在COM2端口上,通过发送itas并接收环回数据,程序会弹出提示框显示接收到itas,数据长度为7。此教程旨在帮助开发者更轻松地集成CSerialPort到MFC项目中。
本文参考了以下资源:CSerialPort项目地址、GitHub和Gitee仓库,以及itas的博客。
版权所有:本内容遵循CC BY-NC-ND 4.0协议,允许署名、非商业使用且禁止演绎。
请详ç»ä»ç»ä¸ä¸vc
ä¸ãVCæ¯ä»ä¹ï¼å¦VCæ¯å¦ä»ä¹ï¼
é¦å VCæ¯ä¸ä¸ªè½¯ä»¶ï¼IDEéæå¼åç¯å¢ï¼ï¼ç¼è¯ãç¼è¾ãè°è¯ï¼
CåC++ãä½C++ä¸çæäºç¹æ§æ¯ä¸ç¨çï¼ä¾å¦I/Oæµï¼å¤æ继æ¿
WindowsSDKï¼è½¯ä»¶å¼åå·¥å ·ï¼
VCççµéï¼MFCï¼å¾®è½¯åºç¡ç±»åºï¼
ATLï¼ActiveX模æ¿ç±»åºï¼
å ¶ä»çSDKï¼å¦OpenGL,DirectX,ActiveMoive,DrawDib(WinG)
VCæ¯è®¸è®¸å¤å¤ææ¯ç综åï¼å°±å¥½è±¡å°æè¬ç»æï¼ä¸è¬å¨åºç¨ä¸å¦ä¼å ¶ä¸å¾å°ä¸é¨åå°±å¤äºãæ们çç°å¨ç®çï¼å ¶å®ä¸è¿æ¯å¦ä¸å¥å°æé¿æ³ãè¿å¥é¿æ³åºå æ¬ï¼
1ãå »æä¸ç§ä¸¥è°¨ç软件å¼åä¹ æ¯ï¼çæ软件工ç¨çåºæ¬ååã
2ãCè¯è¨åºç¡
3ãC++æåºæ¬å 容ï¼ç±»ã继æ¿æ§ãå°è£ æ§ãå¤ææ§çæ¦å¿µ
4ãå¦ä½ç¨å导建ç«ä¸ä¸ªç¨åºæ¡æ¶
5ã设计èå
6ãè®¾è®¡å·¥å ·æ¡
7ã设计å使ç¨å¯¹è¯æ¡ï¼çææ常ç¨ç对è¯æ¡æ§ä»¶ï¼æé®ãéæææ¬ãç¼è¾æ¡ç
8ãç¥éææ ·æ°å»ºç±»ãæåå½æ°ãæååéãæ¶æ¯å¤çå½æ°ã
9ãäºè§£æ常ç¨çWindowsæ¶æ¯ï¼å¦WM_PAINT(éç»çªå£)ï¼é¼ æ æä¸ã弹起ã移å¨ï¼åå§å对è¯æ¡ï¼çã
ãäºè§£æç®åçGDI(å¾å½¢è®¾å¤æ¥å£)ï¼åæåãç»æ¡ãç»ç¹ãç»çº¿ãç»åï¼è®¾ç½®ç»ç¬ãç»å·ã
ãçææ常ç¨çMFCç±»ï¼
CWnd
CDocument
CView
CDC
CDialog
CWinApp
CGdiObjectååç±»
CStringãCPointãCRectãCSizeçç®åæ°æ®ç±»å
CFile
以ä¸æå°çè¿äºå 容ï¼æ¯æ¯ä¸ªäººé½ä¼ç¨å°çå 容ã
äºãMFCç®ä»
ä¸è¿°ä¸»è¦å 容é½æ¯ä¸å®é æä½å ³ç³»é常å¯åçï¼å¨æ¤ä¸å¯è½è®²æ¸ æ¥ï¼èä¸ï¼è¿äºå¨ä¸è¬ç书éé½ä¼è®²å°ãæ主è¦å°æéè¦çMFCä»ç»ä¸ä¸ã
MFCæ¯å¯¹WindowsAPIçå°è£ ï¼å¤§å¤§ç®åäºæ们çå·¥ä½ï¼å¦VC主è¦å°±æ¯è¦å¦MFCï¼å¤§çº¦æå¤ä¸ªç±»ï¼ä½å¸¸ç¨çä¹å°±äºä¸å个ãåºè¯¥è±¡è4级åè¯ä¸æ ·å°è¿äºå¸¸ç¨ç±»ææï¼å½ç¶ä¸è¦æ»è®°ï¼è¦éè¿ç帮å©ãçä¾åãå¨æç»ä¹ æ¥å¦ä¼å®ä»¬ï¼èä¸ï¼å¹¶éæ¯ä¸ªç±»çå é¨çææå½æ°é½è¦å¦ä¼ï¼è¦æ¥ç§¯æç´¯ãå¦æççæ³æ为é«æï¼å个ç¬è®°æ¬æèªå·±è®¤ä¸ºéè¦çç±»ãå½æ°è®°ä¸æ¥ï¼éæ¶å¦ä¹ ï¼ä¹æ¯å¾å¥½ççªå»æ¹æ³ã
ä¸é¢ä»ç»æéè¦çMFCã
CWndï¼çªå£ï¼å®æ¯å¤§å¤æ°âçå¾è§çä¸è¥¿âçç¶ç±»ï¼Windowséå ä¹ææçå¾è§çä¸è¥¿é½æ¯ä¸ä¸ªçªå£ï¼å¤§çªå£éæ许å¤å°çªå£ï¼ï¼æ¯å¦è§å¾CViewãæ¡æ¶çªå£CFrameWndãå·¥å ·æ¡CToolBarã对è¯æ¡CDialogãæé®CButtonï¼etc;ä¸ä¸ªä¾å¤æ¯èåï¼CMenuï¼ä¸æ¯ä»çªå£æ´¾ççã该类å¾å¤§ï¼ä¸å¼å§ä¹ä¸å¿ å¦ï¼ç¥éå°±è¡äºã
CDocumentææ¡£ï¼è´è´£å åæ°æ®ä¸ç£çç交äºãæéè¦çæ¯OnOpenDocument(è¯»å ¥),OnSaveDocumentï¼åçï¼,Serializeï¼è¯»åï¼
CViewè§å¾ï¼è´è´£å åæ°æ®ä¸ç¨æ·ç交äºãå æ¬æ°æ®çæ¾ç¤ºãç¨æ·æä½çååºï¼å¦èåçéåãé¼ æ çååºï¼ãæéè¦çæ¯OnDraw(éç»çªå£)ï¼é常ç¨CWnd::Invalidate()æ¥å¯å¨å®ãå¦å¤ï¼å®éè¿æ¶æ¯æ å°è¡¨å¤çèåãå·¥å ·æ¡ãå¿«æ·é®åå ¶ä»ç¨æ·æ¶æ¯ãä½ èªå·±ç许å¤åè½é½è¦å å¨éé¢ï¼ä½ æ交éæå¤çå°±æ¯å®ã
CDC设å¤ææ¬ãæ 论æ¯æ¾ç¤ºå¨è¿æ¯æå°æºï¼é½æ¯ç»å¾ç»ç¨æ·çãè¿å¾å°±æ½è±¡ä¸ºCDCãCDCä¸å ¶ä»GDIï¼å¾å½¢è®¾å¤æ¥å£ï¼ä¸èµ·ï¼å®ææååå¾å½¢ãå¾åçæ¾ç¤ºå·¥ä½ãæCDCæ³è±¡æä¸å¼ 纸ï¼æ¯ä¸ªçªå£é½æä¸ä¸ªCDCç¸èç³»ï¼è´è´£ç»çªå£ãCDCæ个常ç¨åç±»CClientDCï¼çªå£å®¢æ·åºï¼ï¼ç»å¾é常éè¿CClientDCå®æã
CDialog对è¯æ¡
CWinAppåºç¨ç¨åºç±»ãä¼¼äºCä¸çmainå½æ°ï¼æ¯ç¨åºæ§è¡çå ¥å£å管çè ï¼è´è´£ç¨åºå»ºç«ãæ¶çï¼ä¸»çªå£åæ档模æ¿ç建ç«ãæ常ç¨å½æ°InitInstanceï¼ï¼ï¼åå§åã
CGdiObjectååç±»,ç¨äºå设å¤ææ¬ç»å¾ãå®ä»¬é½éè¦å¨ä½¿ç¨åéè¿DCã
CPenç¬ï¼ç»çº¿
CBrushå·åï¼å¡«å
CFontåä½ï¼æ§å¶æåè¾åºçåä½
CBitmapä½å¾
CPaletteè°è²æ¿
CRgnåºåï¼æå®ä¸ååºåå¯ä»¥ç¨äºåç¹æ®å¤çã
CFileæ件ãæéè¦çä¸å¤æ¯Openï¼æå¼ï¼,Readï¼è¯»å ¥ï¼,Writeï¼åï¼
CStringå符串ãå°è£ äºCä¸çå符æ°ç»ï¼é常å®ç¨ã
CPointç¹ï¼å°±æ¯ï¼x,yï¼å¯¹
CRectç©å½¢ï¼å°±æ¯ï¼left,top,right,bottomï¼
CSize大å°ï¼å°±æ¯ï¼cx,cyï¼å¯¹ï¼å®½ãé«ï¼
ä¸ãç¨å¥½MSDNåä¾å
ä½ä¸ºæé«ï¼æ¨èççä¾åæï¼
nHelloæç®åçç¨åºæ¡æ¶
nScribbleé¼ æ ç»å¾ãæç¨ï¼ç¼ç¨åºç¡ï¼GDI
nDiblookå¾åå¤çæç®åèä¾
nMFCIEå ç¹ç½æµè§å¨
nEnrollæ°æ®åº
nDaoviewDao(æ°æ®è®¿é®å¯¹è±¡ï¼èä¾ãæ åååè§æ§ä»¶
nCubeOpenGLèä¾ï¼ç»ä¸ä¸ªä¸ææ转çæ¹å
nHierSvrOLEæå¡å¨
nOclientOLEå 容å¨
nDrawclié¼ æ ç»å¾ãä¹å æ¬OLEã
nWordPadååæ¿ãOLE
åãå ç¹ç»éª
A.为ä»ä¹è¦ç¨Windowsèä¸æ¯DOSç¼ç¨
Windowsç¼ç¨å¹¶ä¸æ¯DOSç¼ç¨é¾å¾å¤ï¼åªæ¯å¨ååæ¥è§¦çæ¶åæå°å¤´ç»ªç¹å¤ï¼ä¸ç¥ä»ä½ä¸æãå®é ä¸ï¼å¦æä½ ä¼Cè¯è¨ï¼ä½ ä¼åç°Windowsç¼ç¨çé¾åº¦å¹¶ä¸æ¯å½å¹´å¦Cè¯è¨æ¶å¤§ãDOSç¼ç¨è¦æ³æ为é«æï¼ä¹éè¦å¦ä¹ å ç¾ä¸ªå½æ°ï¼æ 论æ¯TCãBCãMicrosoftCï¼ï¼å¹¶è¦æ·±å ¥äºè§£æ±ç¼è¯è¨çº§çDOSåè½è°ç¨ãèç°å¨å¨Windowsä¸ï¼ä»åºç¸åçå·¥ä½éï¼ä½ å´å¯ä»¥è·å¾å åçæ¶çãå¦æä½ ä»¥åçæDOSç¼ç¨ï¼ç°å¨åæWindowsç¼ç¨ï¼åªè¦ä¸¤ä¸ªææè¯å®ä¼æå°å·¨å¤§çä¼è¶æ§ï¼å¨DOSä¸ï¼æ¯ä¸ä»¶äºé½è¦èªå·±å¹²ï¼èä¸è¿æKå åãæ¾ç¤ºç²¾åº¦ççéå¶ï¼å®å¨æ¯äºåååäºã
B.为ä»ä¹è¦ç¨VCèä¸æ¯å ¶ä»Windowsç¼ç¨è¯è¨
n大å¤æ°å¤§å软件ï¼å æ¬Windowsèªå·±ï¼é½æ¯ç¨CãC++ç¼çï¼æ以å¯ä»¥å©ç¨çæºä»£ç ç¹å«å¤ãä¾å¦Photoshopï¼å°±æVCçç¼ç¨æ¥å£ãçå ¶ä»çè¯è¨é½ä¸å¦VCæåå²ä¼å¿ãèä¸VCçå¼åå·¥å ·ç¹å«å¤ï¼ä»æ§ä»¶å ¬å¸å°ç¡¬ä»¶å¼ååï¼å ¶äº§åå¾å°æ¢ä¸æä¾VCæ¥å£çã
nVCéåç»ç»å¤§å·¥ç¨ï¼VBå°±ä¸è¡ï¼
nBorlandC++æC++Builderä¹å¾ä¸éï¼å¹¶ä¸æ¯VCå·®ãä½BCççæ¬å ¼å®¹æ§ä¸å¥½ï¼ä»3.1å°4.0å°±åºç°â代æ²âï¼èä¸VCæä¾äºæ为丰å¯çææ¡£åèä¾,VCçåèèµæä¹è¿æ¯BCå¤ã并ä¸VCä¸å ¶ä»çVisualStudioæåå¯ä»¥åè°å·¥ä½ï¼å¯¹è½¯ä»¶å·¥ç¨æå©ã
n
C.å¼å§ä¸è¦å¦WinAPIç¼ç¨ï¼ä½ä»¥åæ好å¦å¦WinAPI
ç¹å«è¦æ³¨æï¼å¼å§ä¸è¦ä¹°è®²WindowsSDKç¼ç¨ç书ãä¸ä¸ªèåæèçä¾åå°±æ¯âHelloWorldâãåç§è®¡ç®æºè¯è¨å¨å ¥é¨è¯¾ä¸å¾å¾é½ç»åºä¸ä¸ªä¾åï¼æ¾ç¤ºä¸è¡æåâHelloWorldâï¼æ 论æ¯å¨BasicãCãPascalï¼çè³æ±ç¼ä¸ï¼è¿ä¸ªæç®åçå°ç¨åºé½å è¡å°±å¯ä»¥åå®ãä½å¨æ©æçWindowsç¼ç¨ä¸ï¼åæ讲å°çâHelloWinâè¿ä¸ªæåçä¾åå°±è¦ç»ç»ä¸ä¸ªå·¥ç¨ãåä¸å ç¾è¡ä»£ç æè½å®ç°ãè¿å°±åè·äºå¾å¤æ³å¦Windowsç¼ç¨ç人ãå®é ä¸ï¼å¨Windowsä¸æ¾ç¤ºâHelloworldâ,æç®åçæ¹æ³åªè¦5è¡å°±å¤äºï¼
#includeâwindows.hâ
voidWinMain()
{
MessageBox(NULL,âHelloWorld!â,âMyFirstWindowsApplicationâ,MB_OK);
}
å½ç¶è¿ä¸ªç¨åºåªå»ºç«äºä¸ä¸ªæç®åç对è¯æ¡ï¼ä½è¿å·²ç»å¤äºã
å¦æä½ æ²¡æSDKç¼ç¨çç»éªï¼å¦VCå°±æ¯è¦å©ç¨MFCç»è¿Windowsç¼ç¨ç许å¤ç»èãæ好çå·¥å ·ä¸ºä»ä¹ä¸ç¨å¢ï¼ç°å¨ä½ å¨VCåä¸ä¸ªâHelloWorldâï¼åªè¦åä¸è¡ä»£ç å°±å¯ä»¥äºã
voidCYourView::OnDraw(CDC*pDC)
{
//â¦â¦.å ¶ä»ç代ç
pDC->TextOut(,,âHelloWorld!â);
}
ä½MFCä¸æ¯ä¸è½çï¼WinAPIåVCä¸æå¾å¤åè½å¨MFCä¸å¹¶ä¸è½åæ åºæ¥ãå¨å ¥é¨åï¼è¦æ³åæ¥VCçå®å ¨è½åï¼WindowsAPIè¿æ¯é常éè¦çãèä¸ï¼è¿äºAPIå¨å ¶ä»Windowsè¯è¨ä¸ä¹ç¨å¾å°ã
å¦è¯è¨ï¼ä¸ç»æ¦éçä¹å·®ä¸å¤ãVCãVBãDlphiãVFPï¼ä»¥åå ¶ä»çWindowsç¼ç¨è¯è¨ï¼é½å±äºåä¸ä¸ªé¨æ´¾ï¼Windowsé¨ï¼è½ç¶æå¼ä¸åï¼ä½å åé½æ¯ä¸æ ·çï¼è¿å°±æ¯WindowsAPI(åºç¨ç¼ç¨æ¥å£)ï¼å¤§æ¦æ¯ä¸¤å个å½æ°ãä»»ä½æ¦åï¼æå¼å³ä½¿åå¤æï¼é常ä¹è½å¨å¾çæ¶é´å è®°ä¸æ¥ï¼ä½å åå°±ä¸æ¯ä¸æä¸å¤çäºãèä¸ï¼åé¨æ´¾çå åä¸åï¼UnixãLinuxé¨æUinxçå åï¼Apple(è¹æ)é¨æMacçå åï¼Javaæ´æ¯èªæä¸æ´¾ãæ们è¿é说çå¦VCï¼åªæ¯å¦æå¼ï¼å¦æå¼ä¸ä¸ªæå·®ä¸å¤å°±å¤äºï¼èªæç两个ææå°±å¯ä»¥ææ¡ãå å¦æå¼ï¼åå¬äººæ¯å¤äºï¼ä½åé«æä¸è¿æï¼éåºä¸ä¸å¯ãè¦æ³ç²¾éVCï¼å¿ é¡»çæWindowsAPIã
D.é«çº§è¯è¨ä¸èªç¶è¯è¨
ä¸é¨é«çº§è¯è¨ä¸ä¸é¨èªç¶è¯è¨æ¯ç±»ä¼¼çãå ³é®è¦ç´ æä¸ï¼
è¯æ³ï¼äºè§£CåC++åºæ¬è¯æ³ï¼è¿æ¯æ¯è¾å®¹æçã
ä¿®è¾ï¼ç¼ç¨çèºæ¯åé£æ ¼ãé常ï¼è¿æ¯ä¸è½¯ä»¶å·¥ç¨è系起æ¥çãç®æ³ä¸çå°ä¼ä¿©å¹¶éæ¯å ³é®çã严谨ï¼ä¸¥æ ¼æç §è§èå»åï¼åæ¶åè½åæ¥åºæ大çåé æ§ï¼ææ¯è¯è¨å¦å®¶çæ¬è²ã
è¯æ±ï¼å¦ä½å©ç¨å«äººçå·¥ä½ï¼å¦ä½å©ç¨èªå·±ä»¥åçå·¥ä½ï¼è¿æ¯ä¸ä¸ªè½¯ä»¶å·¥ç¨å¸æåçå ³é®ãå¦æè¯æ±éä¸ä¸°å¯ï¼å°±åä¸åºå¥½æç« ï¼å°±ä¼ææ³æ³è¡¨è¾¾ä¸åºãä¸ä¸ªäººçè¯æ³å¨ä¸å°å¦ä¹åå°±åºæ¬ä¸å¦æäºï¼ä¿®è¾æ°´å¹³ä¹å¨å¹´è½»æ¶å°±ç¡®å®äºï¼ææè¯æ±ééè¦æ ¹æ®éè¦ä¸æå¦ä¹ ãä¸ææ©å ãVCç¼ç¨ä¸ï¼æ¥æ大çè¯æ±éå°±æå³çè¦ææ¡è¾å¤çç±»ãå½æ°åå ¶ä»ç¼ç¨ç»ä»¶ãå¦ï¼WindowsSDK,MFC,以åä½ æä¸æ»çé¢åçç°æçSDKï¼æ¯å¦3Dç¼ç¨ä¸çOpenGL,å¤åªä½ç¼ç¨ä¸çDirectXï¼å¾åå¤çä¸çVictoråºãå¦å¤ï¼ActiveXæ§ä»¶çææ¡å¾å¾ä¹æ¯æè´¥çå ³é®ãæ们è¿å å¹´çå·¥ä½ä¹æ»ç»æäºä¸ä¸ªç±»åºï¼å«IPXï¼å¾åå¤çæ¡æ¶ï¼ï¼å¤§å¤§ç®åäºå¾åå¤ççå·¥ä½ï¼ä¸è¿ç°å¨è¿æå¾å¤ç»èé®é¢è¦è§£å³ï¼å¦ææåå¦æå ´è¶£å¯ä»¥åä¸è¿æ¹é¢çå·¥ä½ã
å¦ä¹ VCï¼åä¸ä¸è¦ç¨æ们å¨å¦æ ¡éå¦è±è¯çæ¹æ³ï¼èè¦ç¨å°å©å¦è¯´è¯çæ¹æ³ãæè°å¦è±è¯çæ¹æ³ï¼å°±æ¯æ们å¨æ¬ç§æ¶å¦Cè¯è¨çé£ç§æ¨¡å¼ï¼è¯¦ç»æææ¯ä¸ä¸ªç»èï¼è大éçè§åï¼å¾å°ä¸æºå®è·µï¼æ²¡æå®é é®é¢ä¾è§£å³ï¼æåç±èè¯æ¥æå®å¦ä¹ ææãè¿ç§æ¨¡å¼çåæ大家é½æ¸ æ¥ï¼æ们å¦äºåå å¹´è±è¯ï¼å¯æä¸å°äººè¿åªä¼åäºå个åè¯ï¼åç¾æåçæç« ï¼ä¸ä¼è¯´ï¼ä¸è½å¬ï¼å°¤å ¶è¦å½çæ¯ï¼çä¸æVCç帮å©ææ¡£ãæ们è¦è±¡å©´å¿ä¸æ ·ï¼å¨ä½¿ç¨ä¸å¦ä¼è¯æ³ãä¿®è¾åè¯æ±ï¼ä¸å¼å§è¯å®åªè½ç¼åºæç³ç³çï¼å°±å¥½è±¡å°å©å¼å§åªä¼è¯´ï¼âç¸ç¸å车车âï¼ä½âç¸ç¸ââ车车âè¿äºè¯å¯¹å°å©æ¯æéè¦çï¼å¦ä¹ çæçåèæé«ãå¦VCçæ¶åï¼åºä»æçéè¦åºåï¼å åä¸ä¸ªæç®åçä¸è¥¿ï¼ç¶åä¸ç¹ä¸ç¹å¤æèµ·æ¥ï¼è±¡æ»éªçä¸æ ·ã
å¦ä¹ VCå°¤å ¶è¦åå«äººäº¤æµï¼ä½ è¦è¦æèä¸æç½çï¼ä¹è®¸å«äººæ©å°±è§£å³äºãä¸å®è¦åäºå¦ä¹ ï¼ä»ä¹¦åºæ¾åºæç¨ç书ï¼å身边çé«æå¦ä¹ ï¼å¯»æ¾å¯ä»¥å©ç¨çæºä»£ç ãç±»åºãç»ä»¶ãæ§ä»¶ãåºï¼å¦æè½ä¸äºè¿ç½ï¼é£å°±æ´å è½è§£å³é®é¢äºã
JBoss反序列化漏洞(CVE--)
JBoss存在一个严重的反序列化漏洞(CVE--),该漏洞源于HttpInvoker组件的ReadOnlyAccessFilter过滤器中的doFilter方法,该方法未经安全检查直接处理客户端提交的序列化数据,可能导致恶意用户通过精心构造的数据执行任意代码。最新发现,JBossAS 6.x版本也受此漏洞影响,攻击者无需用户验证即可获得服务器控制权。为防止潜在风险,强烈推荐尽快将系统升级至JBossAS 7版本。
Java序列化和反序列化是Java编程中的常见操作,但若处理不当,会成为安全风险。漏洞具体表现为在HttpInvoker的源码中,doFilter函数对http中的数据直接调用readobject()进行反序列化操作。
漏洞利用分为两个步骤:首先,通过浏览器访问目标服务器的默认页面,然后访问特定的反序列化漏洞页面,服务器会尝试解析用户提交的POST内容进行反序列化操作。攻击者可以借助ysoserial工具生成恶意序列化数据,构造Payload,利用Runtime.getRuntime().exec()的特性执行Shell命令,如bash反弹至本地指定端口。
在利用过程中,需要注意对命令进行编码以避免被分割,同时可能利用${ IFS}字符进行绕过。实验中,通过CommonsCollections1库生成的POC文件发送至nc监听的端口,接收并执行反弹回来的Shell命令。然而,此类操作仅限于安全研究,切勿对未经授权的网站进行恶意操作。
为了系统安全,建议对受影响的系统进行紧急修复,可以通过访问官方提供的修复文档来进行升级和配置更改。