Linux平台C语言Socket编程练习之线程专用数据TSD实现

作者: 分类: 学习记录 评论: 暂无 时间: 2016-11-26 浏览: 1,762 次

0x00 要求

采用多线程并发服务器技术,服务器可以同时接受多个客户的请求。具体要求如下:

服务端

接收并显示与之连接的客户端的名称;

接收客户端发来的字符串,显示出来,并对字符串做反转处理,最后将处理后的字符串发回给客户;

在每个用户退出时要显示该用户输入的所有信息。

客户端

根据客户输入的服务器IP地址,向服务器发起建立连接的请求;

接收客户输入的客户端名称,并把该客户端名称发给服务器;

接收客户输入的字符串,将字符串发送给服务器;

接收服务器发回的反转处理后的字符串并显示。继续接受客户输入的字符串,直到用户输入quit时退出。

0x01 代码

阅读全文»

Linux平台C语言Socket编程练习之多线程服务器

作者: 分类: 学习记录 评论: 暂无 时间: 2016-11-25 浏览: 3,966 次

0x00 要求

采用多线程并发服务器技术,服务器可以同时接受多个客户的请求。具体要求如下:

服务端

接收并显示与之连接的客户端的名称;

接收客户端发来的字符串,显示出来,并对字符串做反转处理,最后将处理后的字符串发回给客户。

客户端

根据客户输入的服务器IP地址,向服务器发起建立连接的请求;

接收客户输入的客户端名称,并把该客户端名称发给服务器;

接收客户输入的字符串,将字符串发送给服务器;

接收服务器发回的反转处理后的字符串并显示。继续接受客户输入的字符串,直到用户输入quit时退出。

0x01 代码

阅读全文»

Linux平台C语言Socket编程练习之多进程服务器

作者: 分类: 学习记录 评论: 暂无 时间: 2016-11-25 浏览: 3,194 次

0x00 要求

采用多进程并发服务器技术,服务器可以同时接受多个客户的请求。具体要求如下:

服务端

接收并显示与之连接的客户端的名称;

接收客户端发来的字符串,显示出来,并对字符串做反转处理,最后将处理后的字符串发回给客户。

客户端

根据客户输入的服务器IP地址,向服务器发起建立连接的请求;

接收客户输入的客户端名称,并把该客户端名称发给服务器;

接收客户输入的字符串,将字符串发送给服务器;

接收服务器发回的反转处理后的字符串并显示。继续接受客户输入的字符串,直到用户输入quit时退出。

0x01 代码

阅读全文»

Linux平台C语言Socket编程练习之UDP套接字

作者: 分类: 学习记录 评论: 暂无 时间: 2016-11-25 浏览: 3,344 次

0x00 要求

实现一个基于UDP协议的服务器-客户端程序,要求完成以下功能:

服务端

接收客户的连接请求,并发送欢迎信息,显示客户的IP地址和端口号;
 
循环接收接收客户传来的字符串,反转后传递给客户; 

客户端

从命令行读入服务器的IP地址;并连接到服务器;
 
循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序,如果用户输入的是quit,则关闭连接;
 
客户程序显示反转后的字符串;

0x01 代码

阅读全文»

实用工具:Layer 子域名挖掘机4.1 全新重构+175万大字典

作者: 分类: 神兵利器 评论: 暂无 时间: 2016-11-16 浏览: 1,949 次

经常看到有文章推荐用这个子域名挖掘的小工具,但之前都没好好写,代码很乱,效率也不高,有时候还经常崩溃,既然大家这么喜欢用,那干脆今晚抽了点时间全部重写了下,新版更稳定,也加入了更实用的端口探测功能,可以在挖掘子域名的同时扫描端口。
优化详情:
1、新起项目,代码全部重写,性能更优更稳定。
2、增加子端口探测功能,方便渗透测试。
3、增加DNS服务器切换和自定义,目前测试DNSPOD最快,个人测试最快达到了每秒3000+条验证,速度比上个版本增加5–10倍(速度会越跑越快)。
切换DNS服务器也可以避免进行大量DNS查询的时候影响正常上网。
4、对字典权重进行了调整,更容易命中的排在更前。
5、增加升级提醒,如果还有下个版本的话,会有提醒。
特别提醒:基于.NET4.5编译,得安装.NET4.5才能用 ^_^
程序下载地址:https://pan.baidu.com/s/1dE4jgTr 密码: 9f5u
源码下载地址:https://pan.baidu.com/s/1qXURfzu
BTW:我也不知道360这个傻逼为什么会报窃取QQ密码的毒。

Layer 子域名挖掘机4.1 全新重构+175万大字典.png

来自法师Seay博客

作为一个penetration tester必知必读的好书推荐

作者: 分类: 干货分享 评论: 1条 时间: 2016-11-10 浏览: 6,523 次

0x00 前言

至于书籍推荐这个话题,很多前辈都回答过了,但还是有很多刚入门的小伙伴还是一言不合就问该看书籍,作为一个搞Web安全的菜鸟忠恳告诉你,你第一本该看的书是《提问的智慧》,附上一个脑图:

提问的智慧.png

既然是说Web安全相关的书籍,那么就不扯二进制安全方面,还是希望搞二进制的表哥专门来一份关于二进制安全的书单。在学Web安全前,你可能得先接触编程、协议和Linux等,至于它们的重要性就不用多说了,因为前辈和同行的小伙伴们都已经说地够多了。下面推荐的书籍并不说它们就是最优秀的,因为第一本来就没有最完美的说法,第二因为个人水平有限,视野狭窄,很多优秀有关Web安全书籍没有说到,所以请大家补充(本文所提到的大多都是中文或中文译版),第三任何东西对每个人来说都不一样,最适合自己的才是最好的。另外下面提到的书籍并不是说你一定要读完,惭愧地说我个人也还没有全部读完,你完全可以根据自己的情况选读其中书籍,不过我个人还是推荐读完,因为它们的内容和质量都是受到大家认可和好评的,更何况多读点好书还是有好处的。
另外由于书籍版权问题,所以没有给出PDF链接,不过它们在网上大多都有PDF版本,如有所需,请君自取吧:P 有的给出链接是因为国内安全爱好者翻译的书籍但是在国内并没有正式出版。没给出书评和简介原因是因为网上已经有很多说明了,不想赘述,如若想看随便一搜便是。至于为什么推荐那么多关于Python的书籍呢,除了客观原因之外,主观原因是人生苦短,我用Python(逃ε=ε=ε=┏(゜ロ゜;)┛)。

0x01 书籍

《信息安全标准和法律法规(第二版)》(注:武汉大学出版社)
《HTTP权威指南》
《HTML5权威指南》
《JavaScript权威指南(第6版)》
《TCP/IP详解卷1:协议》
《SQL编程基础(原书第3版)》
《PHP和MySQL Web开发(第四版)》
《PHP安全基础》
《PHP应用程序安全编程》
《高级PHP应用程序漏洞审核技术》
《精通正则表达式 (第3版) 》
《正则指引》
《鸟哥的Linux私房菜 基础学习篇 (第三版) 》
《Linux Shell脚本攻略》
《C Primer Plus(第6版)中文版》
《数据结构(C语言版)》(注:机械工业出版社)
《编译原理:原理、技术与工具》(注:机械工业出版社)
《C++ Primer Plus (第6版) 中文版》
《Python核心编程(第二版)》
《Python黑帽子:黑客与渗透测试编程之道》
《Python绝技:运用Python成为顶级黑客》
《精通黑客脚本》
《XSS跨站脚本攻击剖析与防御》
《XSS Filter Evasion Cheat Sheet 中文版》
《Robust Defenses for Cross-Site Request Forgery 中文译文版》
《SQL注入攻击与防御(第2版)》
《SQL注入自学指南》
《上传攻击框架》
《上传验证绕过》
《Web安全测试》
《Web应用安全威胁与防治》
《Web应用程序安全手册》
《Web入侵安全测试与对策》
《Web安全深度剖析》
《Web之困:现代Web应用安全指南》
《Web应用安全权威指南》
《Web应用漏洞侦测与防御》
《白帽子讲Web安全》
《白帽子讲浏览器安全》
《Web前端黑客技术揭秘》
《安全之路-Web渗透技术及实战案例解析-第2版》
《黑客攻防技术宝典:Web实战篇(第2版)》
《黑客攻防技术宝典:浏览器实战篇》
《黑客大曝光:网络安全机密与解决方案(第7版)》
《代码审计:企业级Web代码安全架构》
《Kali Linux渗透测试的艺术》
《Kali Linux渗透测试实战》
《Kali Linux渗透测试技术详解》
《Kali Linux高级渗透测试》
《Web渗透测试:使用Kali Linux》
《Kali Linux & BackTrack渗透测试实战》
《Kali Linux无线网络渗透测试详解》
《Metasploit渗透测试指南》
《Metasploit渗透测试魔鬼训练营》
《Wireshark 数据包分析实战(第2版)》
《渗透测试指南:必知必会的工具与方法》
《网络扫描技术揭秘:原理、实践与扫描器的实现》
《灰帽黑客:正义黑客的道德规范、渗透测试、攻击方法和漏洞分析技术》
《黑客大曝光:无线网络安全(原书第3版)》
《SRE:Google运维解密》
《企业linux安全运维理念和实战》
《日志管理与分析权威指南》
《Linux 服务器安全策略详解》
《Linux安全入侵防范检测和恢复》
《Linux防火墙(原书第三版)》
《网络安全监控实战 : 深入理解事件检测与响应》
《互联网企业安全高级指南》
国外整理的一套在线渗透测试资源合集
信息安全学习购书清单

0x02 拓展

《黑客大追踪:网络取证核心原理与实践》
《深入理解计算机系统(原书第2版)》
《计算机网络(第5版)》(注:清华大学出版社)
《社会工程:安全体系中的人性漏洞》
《反欺骗的艺术》
《反入侵的艺术》
《TCP/IP详解·卷2:实现》
《图解密码技术第3版》
《应用密码学:协议、算法与C源程序(原书第2版)》
《网络分析技术揭秘:原理、实践与WinPcap深入解析》
《网络渗透技术》
《Shellcoder编程揭秘》
《网络安全监控:收集、检测和分析》
《黑客免杀攻防》
《Java编程思想(第4版)》
《Java安全(第二版)》
《安全编程代码静态分析》
《Python灰帽子-黑客与逆向工程师的Python编程之道》
《电子数据取证》(注:清华大学出版社)
《数据隐藏技术揭秘:破解多媒体、操作系统、移动设备和网络协议中的隐秘数据》
《数据驱动安全 : 数据安全分析、可视化和仪表盘》
《威胁建模 : 设计和交付更安全的软件》
《安全模式最佳实践》
《算法导论(原书第2版)》
《程序员的自我修养:链接、装载与库》
《代码整洁之道》
《程序员的怒吼》

最后送给大家一句自己在安全道路上的座右铭:发现大师,追随大师,成为大师,超越大师!

最优秀的Kali Linux渗透测试课程

作者: 分类: 渗透测试 评论: 2条 时间: 2016-11-06 浏览: 12,176 次

Kali Linux渗透测试.jpg

0x00 前言

称为最优秀我个人觉得一点都不为过,目前市面上的那些课程先不说能不能把工具实现的原理讲清楚,就连工具的功能也是一知半解,更不说系统完整的渗透测试框架,yuanfh老师可能是我见过讲Kali Linux渗透测试最优秀的老师,很有幸学到老师的课程,老师讲课严谨细致的态度给我留下深深的印象,以致于每节课老师都讲了1个小时以上,老师在课程详细讲解渗透测试的方法、思路、工具原理,以及个人从事信息安全行业大量的经验和思考,个人觉得作为信息安全研究员,对知识不仅要知其然,更要知其所以然,讲究理论和实践结合,老师在课程花了大量的时间讲各种原理,做了许多的实例演示,让我从中学到了很多,再次向老师辛勤的付出说声谢谢!所以这里向静得下心研究安全的小伙伴们推荐,课程也不贵,至于课程质量我也过多赘述,可以先看看小伙伴们的课程评价

阅读全文»

Linux平台C语言Socket编程练习之TCP套接字

作者: 分类: 学习记录 评论: 暂无 时间: 2016-11-03 浏览: 3,227 次

0x00 要求

实现一个基于TCP协议的服务器-客户端程序,要求完成以下功能。

服务端:

接收客户的连接请求,并发送欢迎信息,显示客户的IP地址和端口号;

循环接收接收客户传来的字符串,反转后传递给客户; 

客户端:

从命令行读入服务器的IP地址;并连接到服务器;

循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序,如果用户输入的是quit,则关闭连接;

客户程序显示反转后的字符串;

0x01 代码

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define PORT 1234
#define MAXNUMCLINET 20
#define MAXDATASIZE 100


int main()
{
    int socketfd,bindfd,listenfd,connectfd,opt=SO_REUSEADDR;
    ssize_t recv_num,send_num;
    struct sockaddr_in server,client;
    socklen_t addrlen;
    char recv_buf[MAXDATASIZE],send_buf[MAXDATASIZE];
    char wel[]="[*] Welcome! You can input 'quit' to exit:)";

    if((socketfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("socket() error.");
        exit(1);
    }

    setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr=htonl(INADDR_ANY);

    if((bindfd=bind(socketfd,(struct sockaddr *)&server,sizeof(server)))==-1)
    {
        perror("bind() error.");
        exit(1);
    }

    if((listenfd=listen(socketfd,MAXNUMCLINET))==-1)
    {
        perror("listen() error.");
        exit(1);
    }

    if((connectfd=accept(socketfd,(struct sockaddr *)&client,&addrlen))==-1)
    {
        perror("accept() error.");
        exit(1);
    }

    if((send(connectfd,wel,sizeof(wel),0))==-1)
    {
        perror("send welcome messages fail.");
        exit(1);
    }

    printf("You got a connection from client IP:%s, PORT:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

    while(1)
    {
        if((recv_num=recv(connectfd,recv_buf,MAXDATASIZE,0))==-1)
        {
            perror("recv() error.");
            exit(1);
        }

        printf("[*] Received string:%s\n",recv_buf);

        size_t len=strlen(recv_buf);
        for(int i=0; i<(len/2); ++i)
        {
            char tmp=recv_buf[i];
            recv_buf[i]=recv_buf[len-1-i];
            recv_buf[len-1-i]=tmp;
        }

        strcpy(send_buf,recv_buf);
        printf("[>] Send reverse string:%s\n",send_buf);

        if((send_num=send(connectfd,send_buf,MAXDATASIZE,0))==-1)
        {
            perror("send() error.");
            exit(1);
        }

        if(!strcmp(send_buf,"tiuq"))
        {
            close(connectfd);
            break;
        }
    }
    close(connectfd);
    close(listenfd);
    return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT 1234
#define MAXDATASIZE 100

int main(int argc,char* argv[])
{
    int socketfd;
    ssize_t send_num,recv_num;
    char send_buf[MAXDATASIZE],recv_buf[MAXDATASIZE],wel[MAXDATASIZE];
    struct hostent* remote_host;
    struct sockaddr_in server;

    if(argc!=2)
    {
        printf("Usage:%s <IP address>\n",argv[0]);
        exit(1);
    }

    if((remote_host=gethostbyname(argv[1]))==NULL)
    {
        perror("gethostbyname() error.");
        exit(1);
    }

    if((socketfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("socket() error.");
        exit(1);
    }

    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr=*((struct in_addr*)remote_host->h_addr);

    if((connect(socketfd,(struct sockaddr*)&server,sizeof(server)))==-1)
    {
        perror("connect() error.");
        exit(1);
    }

    if ((recv(socketfd,wel,MAXDATASIZE,0))==-1)
    {
        perror("[!] Receive welcome message fail.");
        exit(1);
    }
    wel[sizeof(wel)-1]='\0';
    printf("%s\n", wel);

    while(1)
    {
        printf("[*] Input string:");
        scanf("%s",&send_buf);
        send_buf[strlen(send_buf)]='\0';

        if((strlen(send_buf))>100)
        {
            printf("[!] Only supports sending fewer than 100 characters.");
            exit(1);
        }

        if((send_num=send(socketfd,send_buf,MAXDATASIZE,0))==-1)
        {
            perror("send() error.");
            exit(1);
        }

        if((recv_num=recv(socketfd,recv_buf,MAXDATASIZE,0))==-1)
        {
            perror("recv() error.");
            exit(1);
        }

        printf("[>] Received reverse string:%s\n",recv_buf);
        if(!strcmp(recv_buf,"tiuq"))
        {
            close(socketfd);
            break;
        }
    }
    close(socketfd);
    return 0;
}

0x02 演示

服务端:

Linux C socket programming practice of the TCP socket server demonstration.png

客户端:

Linux C socket programming practice of the TCP socket client demonstration.png

0x03 心得

在编写代码时一定注意程序的逻辑,先做什么,再做什么,同时要注意服务端和客户端的处理同步。在调用函数时要注意传入的参数类型的一致性以及函数返回值的类型,还有调用bind、accept、connect函数是要注意把server,client的sockaddr_in套接字地址结构强制转化为通用套接字地址结构sockaddr,类似:

bindfd=bind(socketfd,(struct sockaddr *)&server,sizeof(server))

中的(struct sockaddr *)&server。还要注意一个坑,在服务端accept函数的第一个参数必须是socket函数产生的套接字描述符,在本例正确的写法是这样的:

...
if((socketfd=socket(AF_INET,SOCK_STREAM,0))==-1)
...
if((connectfd=accept(socketfd,(struct sockaddr *)&client,&addrlen))==-1)
...

如果你像我一开始写成:

if((connectfd=accept(listenfd,(struct sockaddr *)&client,&addrlen))==-1)

就会报类似的错误:

accept() error.: Socket operation on non-socke

原因是虽然socket()、bind()、listen()、accept()等函数返回的值都是int类型的,但是socket()返回值的意义和其他的函数返回值却不相同,socket()返回的是一个套接字描述符,而其他函数调用成功返回0,出错返回-1,并置errno值,所以要注意这个区别。
另外在判断字符是否相同不要用"=="等号去判断:

if(send_buf=="tiuq")

而是最好使用strcmp()函数:

if(!strcmp(send_buf,"tiuq"))

要不然而出现类似的警告:

warning: comparison with string literal results in unspecified behavior [-Waddress]

虽然不会出现error,但是你懂的,处女座( •̀ ω •́ )y
在拷贝字符串数组不要错误地使用"="去赋值:

send_buf[MAXDATASIZE]=recv_buf[MAXDATASIZE];

正确的方法是使用strcpy()函数:

strcpy(send_buf,recv_buf);